Преобразование строки в type-safe-enum с использованием пользовательского преобразования
Чтобы использовать Enum в сочетании со строками, я реализовал класс StringEnum на основеhttps://stackoverflow.com/a/424414/1293385.
Однако я сталкиваюсь с проблемами, когда пытаюсь реализовать предложенные пользователем операции преобразования.
Класс StringEnum определяется следующим образом:
public abstract class StringEnum
{
private readonly String name;
private readonly int value;
protected static Dictionary<string, StringEnum> instances
= new Dictionary<string, StringEnum>();
protected StringEnum(int value, string name)
{
this.value = value;
this.name = name;
instances.Add(name.ToLower(), this);
}
public static explicit operator StringEnum(string name)
{
StringEnum se;
if (instances.TryGetValue(name.ToLower(), out se))
{
return se;
}
throw new InvalidCastException();
}
public override string ToString()
{
return name;
}
}
Я использую этот класс как базу:
public class DerivedStringEnum : StringEnum
{
public static readonly DerivedStringEnum EnumValue1
= new DerivedStringEnum (0, "EnumValue1");
public static readonly DerivedStringEnum EnumValue2
= new DerivedStringEnum (1, "EnumValue2");
private DerivedStringEnum (int value, string name) : base(value, name) { }
}
Однако, когда я пытаюсь разыграть его, используя
string s = "EnumValue1"
DerivedStringEnum e = (DerivedStringEnum) s;
InvalidCastException возвращается. Проверка кода показывает, что атрибут экземпляров класса StringEnum никогда не заполняется.
Есть ли простой способ это исправить?
Я предпочитаю не использовать атрибут магии C #, такой как [StringValue ("EnumValue1")].
Спасибо!