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);
}
}
¡Excelente respuesta! Sabía que lo había visto en algún lado y no recordaba cómo resolverlo. ¡Gracias! –
¡Gran extensión! Muchas veces la gente se olvida de asegurarse de que el valor esté definido en la enumeración. – Gromer
@Gromer Creo que vale la pena mencionar que .Net 4.0 agregó un método por esa misma razón 'Enum.TryParse() '. – Dan