如何从类型变量获取枚举的默认值

5

在设计时未知的对象上,我循环其属性以执行某些处理。对于每个属性,我必须检查其值是否与默认值不同。

foreach(var p in propertyInfos)
{
    if (something) { ... }
    else if (p.PropertyType.IsEnum)
    {
        object oDefault = GetDefaultValueOfThisPropertyByWhateverMethod();
        if (oDefault == null)
            oDefault = default(p.PropertyType); // not valid
        var vValue = p.GetValue(myObject);

        if (!oDefault.Equals(vValue))
            // Do something enum specific when value is not the default one.
    }
}

我该如何实现这个,考虑到可能存在不包含值为0的枚举项?

7
任何枚举类型的默认值都是零,无论该枚举类型是否包含具有该值的成员。 - DavidG
2
@DavidG 但请注意,这是一个“类型化”的零... - xanatos
@pijemcolu 但那是无效的代码。 - DavidG
1个回答

7
enum的默认值为0,即使0没有定义任何值。最终你可以使用(EnumType)123来表示任何enumenum不会检查/限制它们的“有效”值,只是给一些特定值标签。
请注意,前面提到的0是一个“类型化”的值...因此它是(EnumType)0,而不是(int)0...你可以:
object oDefault = Enum.ToObject(p.PropertyType, 0);

可以处理基于非int的枚举类型,例如:

enum MyEnum : long
{
}

显然,你甚至可以:

object oDefault = Activator.CreateInstance(p.PropertyType);

因为new SomeEnumType()等同于0。


谢谢xanatos,这个方法非常有效!我使用了你的第一个提示,使用Enum.ToObject,现在我的代码按预期工作。 - Sierramike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接