我确信这是相当微不足道的,但我无法做到。
public static string DoSomething(this Enum value)
{
if (!Enum.IsDefined(value.GetType(), value))
{
// not a valid value, assume default value
value = default(value.GetType());
}
// ... do some other stuff
}
行value = default(value.GetType());
无法编译,但希望您能看到我正在尝试的内容。我需要将Enum param设置为它自己类型的默认值。
答案 0 :(得分:5)
我不确定你在这里要做什么,但是编译的'default'行的版本是这样的:
value = (Enum)Enum.GetValues(value.GetType()).GetValue(0);
或者,甚至更干净(来自Paw,在评论中,谢谢):
value = (Enum) Enum.ToObject(value.GetType(), 0);
如果您知道枚举的第一个元素的值为零,则第二个版本只能正常工作。
答案 1 :(得分:2)
如果您可以将此方法移动到自己的类中,那么即使使用通用约束,您实际上也可以执行Paw is suggesting:
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> { }
然后你会做,例如:
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
正如Konrad Rudolph在评论中指出的那样,上述代码中的default(TEnum)
将评估为0,无论是否为给定TEnum
类型的0定义了值。如果这不是您想要的,Will's answer提供了获取第一个定义的值((TEnum)Enum.GetValues(typeof(TEnum)).GetValue(0)
)的最简单方法。
另一方面,如果你想把它带到极端,并缓存结果,这样你就不必总是把它装箱,你可以这样做:
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;
}
}
答案 2 :(得分:1)
Activator.CreateInstance(typeof(ConsoleColor))
似乎有用
答案 3 :(得分:-1)
Enum
的{{1}}为first value
答案 4 :(得分:-1)
您是否考虑过将其作为通用方法?
public static string DoSomething<T>(Enum value)
{
if (!Enum.IsDefined(typeof(T), value))
{
value = (T)Enum.ToObject(typeof(T), 0);
}
// ... do some other stuff
}
方法的调用者应该知道类型。