Para utilizar Enum's en combinación con cadenas, implementé una clase StringEnum basada en https://stackoverflow.com/a/424414/1293385.Cadena de conversión a type-safe-enum utilizando la conversión definida por el usuario
Sin embargo, me encuentro con problemas cuando intento implementar las operaciones de conversión sugeridas definidas por el usuario.
claseEl StringEnum se define como sigue:
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;
}
}
I utilizar esta clase como una base como esto:
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 intento para lanzarlo usando
string s = "EnumValue1"
DerivedStringEnum e = (DerivedStringEnum) s;
Se devuelve una InvalidCastException. La inspección del código muestra que el atributo instancias de la clase StringEnum nunca se completa.
¿Hay una manera fácil de arreglar esto?
Prefiero no usar el atributo C# "magic" como [StringValue ("EnumValue1")].
Gracias!
Lo que hace que significa por magia? –
¿Por qué estás reinventando esta rueda? El atributo de descripción definido en System.ComponentModel y una clase simple y estática harán el trabajo. –
No relacionado directamente con la pregunta/respuesta (Andras Zoltan, creo que es correcto), pero ese diccionario estático en StringEnum me está levantando banderas rojas. Si tiene dos clases enum derivadas diferentes, pero ambas tienen una entrada con el mismo "nombre", (por ejemplo, Colour.Orange y Fruit.Orange) no causará una ArgumentException clave ya agregada dado que el diccionario está estáticamente compartido? Me parece que el diccionario debe redeclararse en cada implementación o incluir la información de tipo junto con el nombre cuando se construye/busca la clave. –