У меня есть набор классов, которые действуют как счетчики, где есть два уровня для представления классификаций. Где Ключ и Цифра никогда не публикуются публично, чтобы заставить любую реализацию работать с самим объектом класса с операторами, а не со свойствами Ключ и Цифра. Я использую ServiceStack для сериализации классов, в которые вложен этот EnumClass. Конечно, ServiceStack.Text, как есть, не поддерживает сериализацию частных членов, но мне было интересно, разработал ли кто-нибудь такую ветку?
Пример кода для верхнего или родительского уровня:
[Serializable]
public class EnumClass
{
[DataMember]
protected internal String Key;
[DataMember]
protected internal Byte Numeral;
public EnumClass(String _key, Byte _number)
{
Key = _key;
Numeral = _number;
}
public static implicit operator int(EnumClass anEnum)
{
return anEnum.Numeral;
}
public static implicit operator string(EnumClass anEnum)
{
return anEnum.Key;
}
public override bool Equals(object obj)
{
bool result = false;
if (obj.GetType() == typeof(EnumClass))
result = Equals((EnumClass)obj);
else if (obj.GetType() == typeof(int))
result = Equals((int)obj);
else if (obj.GetType() == typeof(String))
result = Equals(obj.ToString());
return result;
}
public override String ToString()
{
return Key;
}
public bool Equals(EnumClass anEnum)
{
return anEnum.Equals((int)Numeral);
}
public bool Equals(int value)
{
return Numeral == (byte)value;
}
public bool Equals(string value)
{
return Key == value;
}
public override int GetHashCode()
{
//return Key.GetHashCode() ^ Numeral.GetHashCode();
int result = 0;
unchecked // Overflow is fine, just wrap
{
result = (int)2166136261;
result = ShiftBits.ShiftAndWrap((result * 16777619) ^ Numeral, 2);
for (int x = 0; x < Key.Length; x++)
{
result = ShiftBits.ShiftAndWrap((result * 16777619) ^ Key[x], 2);
}
}
return result;
}
}