In realtà si potrebbe fare quello che Paw is suggesting, anche con un vincolo generico, se si potesse spostare questo metodo per la propria classe:
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> { }
Poi si farebbe, ad esempio:
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
Come Konrad Rudolph fa notare in un commento, default(TEnum)
nel codice precedente valuterà a 0, indipendentemente dal fatto che un valore sia definito o uguale a 0 per il tipo dato TEnum
. Se questo non è ciò che desideri, lo Will's answer fornisce sicuramente il modo più semplice per ottenere il primo valore definito ((TEnum)Enum.GetValues(typeof(TEnum)).GetValue(0)
).
D'altra parte, se si vuole prendere questo al estrema, e memorizzare nella cache il risultato in modo che non si ha sempre a scatola, si potrebbe fare questo:
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;
}
}
fonte
2010-11-04 12:45:26
Come può si chiama anche questo metodo senza che il 'valore' sia definito nell'enumerazione dello stesso tipo di 'valore'? –
@Paw, questo è il modo in cui enum funziona. È possibile memorizzare qualsiasi valore int in un int enum, che sia definito o meno. – fearofawhackplanet
@fearofawhackplanet, sto solo cercando di capire cosa stai cercando di fare. Se vuoi convertire un int in un enum o magari una stringa in un enum? –