2009-06-30 27 views
22

me gustaría tener una conversión explícita entre el de una cadena a una enumeración en C# con el fin de tener esta:C# cadena de conversión explícita a ENUM

(MyEnum) Enum.Parse(typeof(MyEnum),stringValue) 

quisiera expulsar a esto en un operador de conversión explícita , Lo hice pero no funcionó:

public static explicit operator (MyEnum)(value stringValue){ 
    return (MyEnum) Enum.Parse(typeof(MyEnum),stringValue); 
} 

¿Sabes si es posible en C# con .NET 3.5?

Respuesta

29

No se puede realizar un molde. El problema es que una conversión definida por el usuario debe incluirse en una declaración de estructura o clase, y la conversión debe ser hacia o desde el tipo adjunto. Por lo tanto,

public static explicit operator MyEnum(string value) 

es imposible porque ni MyEnum ni string puede ser nunca el tipo envolvente.

La sección pertinente de la # spec ECMA334 C es 17.9.4:

Un operador de conversión convierte a partir de un tipo de fuente, indicado por el tipo de parámetro del operador de conversión , a un tipo de destino, indicado por el retorno tipo de operador de conversión. Una clase o estructura es permitida para declarar una conversión de un tipo de origen S a un tipo de destino T solo si todo lo siguiente es verdadero, donde S0 y T0 son los tipos que resultan de eliminar el final? modificadores, si los hay, de S y T:

S0 y T0 son tipos diferentes.

O bien S0 o bien T0 es la clase o tipo de estructura en la que tiene lugar la declaración del operador.

Ni S0 ni T0 es un tipo de interfaz.

Excluyendo las conversiones definidas por el usuario, una conversión no existe de S a T o de T a S.

Sin embargo, se puede hacer un método de extensión de la clase string.

public static class StringExtensions { 
    public static T ConvertToEnum<T>(this string value) { 
     Contract.Requires(typeof(T).IsEnum); 
     Contract.Requires(value != null); 
     Contract.Requires(Enum.IsDefined(typeof(T), value)); 
     return (T)Enum.Parse(typeof(T), value); 
    } 
} 
+0

¡Excelente respuesta! Sabía que lo había visto en algún lado y no recordaba cómo resolverlo. ¡Gracias! –

+0

¡Gran extensión! Muchas veces la gente se olvida de asegurarse de que el valor esté definido en la enumeración. – Gromer

+1

@Gromer Creo que vale la pena mencionar que .Net 4.0 agregó un método por esa misma razón 'Enum.TryParse() '. – Dan

9

¿Es necesario usar un operador de reparto? Otra opción sería agregar un método de extensión fuera de la cadena:

public static class StringEnumConversion 
{ 
    public static T Convert<T>(this string str) 
    { 
     return (T)Enum.Parse(typeof(T), str); 
    } 
}