Usted podría hacer lo Paw is suggesting, incluso con una limitación genérica, si se pudiera mover este método para su propia clase:
public abstract class Helper<T>
{
public static string DoSomething<TEnum>(TEnum value) where TEnum: struct, T
{
if (!Enum.IsDefined(typeof(TEnum), value))
{
value = default(TEnum);
}
// ... do some other stuff
// just to get code to compile
return value.ToString();
}
}
public class EnumHelper : Helper<Enum> { }
allí tendría que hacer, por ejemplo:
MyEnum x = MyEnum.SomeValue;
MyEnum y = (MyEnum)100; // Let's say this is undefined.
EnumHelper.DoSomething(x); // generic type of MyEnum can be inferred
EnumHelper.DoSomething(y); // same here
Como señala Konrad Rudolph en un comentario, default(TEnum)
en el código anterior evaluará a 0, independientemente de si se define o no un valor para 0 para el tipo dado TEnum
. Si eso no es lo que desea, Will's answer proporciona ciertamente la forma más fácil de obtener el primer definido valor ((TEnum)Enum.GetValues(typeof(TEnum)).GetValue(0)
).
Por otro lado, si quieres llevar esto al extremo , y almacenar en caché el resultado para que no siempre se tiene a la caja, usted podría hacer eso:
public abstract class Helper<T>
{
static Dictionary<Type, T> s_defaults = new Dictionary<Type, T>();
public static string DoSomething<TEnum>(TEnum value) where TEnum: struct, T
{
if (!Enum.IsDefined(typeof(TEnum), value))
{
value = GetDefault<TEnum>();
}
// ... do some other stuff
// just to get code to compile
return value.ToString();
}
public static TEnum GetDefault<TEnum>() where TEnum : struct, T
{
T definedDefault;
if (!s_defaults.TryGetValue(typeof(TEnum), out definedDefault))
{
// This is the only time you'll have to box the defined default.
definedDefault = (T)Enum.GetValues(typeof(TEnum)).GetValue(0);
s_defaults[typeof(TEnum)] = definedDefault;
}
// Every subsequent call to GetDefault on the same TEnum type
// will unbox the same object.
return (TEnum)definedDefault;
}
}
¿Cómo puede ¿incluso llama a este método sin que el 'valor' se defina en la enumeración del mismo tipo que 'valor'? –
@Paw, esa es la forma en que enum funciona. Puede almacenar cualquier valor int en una entrada, ya sea definida o no. – fearofawhackplanet
@fearofawhackplanet, solo trato de entender lo que estás tratando de hacer. Si desea convertir un int a una enumeración o tal vez una cadena a una enumeración? –