Casting string a type-safe-enum usando la conversión definida por el usuario

Para usar Enum's en combinación con cadenas, implementé una clase StringEnum basada enhttps: //stackoverflow.com/a/424414/129338.

Sin embargo, me encuentro con problemas cuando intento implementar las operaciones de conversión sugeridas por el usuario.

La clase StringEnum se define de la siguiente manera:

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;
    }
}

Yo uso esta clase como una base como esta:

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) { }
}

Sin embargo, cuando trato de enviarlo usando

string s = "EnumValue1"
DerivedStringEnum e = (DerivedStringEnum) s;

Se devuelve una excepción InvalidCastException. La inspección del código muestra que el atributo de instancias de la clase StringEnum nunca se llena.

¿Hay alguna manera fácil de arreglar esto?

Prefiero no usar el atributo de C # "magic" como [StringValue ("EnumValue1")].

¡Gracias

Respuestas a la pregunta(4)

Su respuesta a la pregunta