Преобразование строки в 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")].

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос