rzeczywiście może zrobić co Paw is suggesting, nawet z rodzajowe ograniczeń, jeśli można przenieść tę metodę do swojej klasie:
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> { }
Wtedy ty, na przykład:
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
Jak zaznacza Konrad Rudolph w komentarzu, default(TEnum)
w powyższym kodzie oceni na 0, niezależnie od tego, czy wartość jest zdefiniowana dla 0 dla danego typu TEnum
. Jeśli to nie jest to, czego chcesz, Will's answer zapewnia z pewnością najłatwiejszy sposób uzyskania pierwszej wartości zdefiniowanej jako().
Z drugiej strony, jeśli chcesz wziąć to do skrajnego i buforować wynik tak, że nie zawsze musi to pole, można to zrobić:
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;
}
}
Jak można nazywasz tę metodę nawet bez zdefiniowania "wartości" w wyliczeniu tego samego typu co "wartość"? –
@Paw, w ten sposób działa enum. Możesz przechowywać dowolną wartość int w int enum, bez względu na to, czy jest zdefiniowana, czy nie. – fearofawhackplanet
@fearofawhackplanet, próbuję tylko zrozumieć, co próbujesz zrobić. Jeśli chcesz przekonwertować int do enum, a może string na wyliczenie? –