Vous pouvez réellement faire ce Paw is suggesting, même avec une contrainte générique, si vous pouvez déplacer cette méthode pour sa propre 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> { }
Ensuite, vous faire, par exemple:
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
Comme Konrad Rudolph le signale dans un commentaire, default(TEnum)
dans le code ci-dessus évaluera à 0, indépendamment du fait qu'une valeur soit définie ou non pour 0 pour le type donné TEnum
. Si ce n'est pas ce que vous voulez, Will's answer fournit certainement la manière la plus simple d'obtenir la première valeur définie ((TEnum)Enum.GetValues(typeof(TEnum)).GetValue(0)
).
D'autre part, si vous voulez prendre cela à la extrême, et mettre en cache le résultat de sorte que vous n'avez pas toujours à la boîte, vous pouvez le faire:
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;
}
}
Comment vous appelez même cette méthode sans que la 'valeur' ne soit définie dans l'énumération du même type que 'valeur'? –
@Paw, c'est ainsi que fonctionne Enum. Vous pouvez stocker n'importe quelle valeur int dans un entier, qu'il soit défini ou non. – fearofawhackplanet
@fearofawhackplanet, j'essaie juste de comprendre ce que vous essayez de faire. Si vous voulez convertir un int en enum ou peut-être une chaîne enum? –