相同的值,反射中的未知类型相等

时间:2014-09-18 22:48:46

标签: c# reflection enums

我正在使用反射来从对象中检索属性的值。值是枚举:

enum MyEnum 
{
    None,
    SomeValue
}

在一个对象上,该属性还有一个属性

class MyObject
{
    [MyAttribute(ExclusionValue = MyEnum.None)]
    public MyEnum EnumProperty { get; set; }
}

所以当我到达反射部分的东西时,我想检查一下这个值是否等于ExclusionValue

// exclusionValue is the value taken from the attribute
// propertyValue is the value retrieved by reflection of the containing object, so at 
// this time it just an `object` type.

if(exclusionValue == propertyValue)
{
    // Both values are `MyEnum.None` but the if statement never evaluates true.
}

我试图将exclusionValue转换为对象,以便它们都是相同的可见类型

if((object)exclusionValue == propertyValue)

但这也永远不会回归真实。它们肯定是相同的枚举值。此外,我无法在此if语句中显式地转换任何内容,因为在所有不同类型(不仅仅是枚举)的对象中还有许多其他属性需要相同的检查,例如:

class MyObject
{
    [MyAttribute(ExclusionValue = MyEnum.None)]
    public MyEnum EnumProperty { get; set; }

    [MyAttribute(ExclusionValue = false)]
    public bool BoolProperty { get; set; }
}

修改

它们只会是值类型(没有结构)或字符串。

1 个答案:

答案 0 :(得分:1)

您需要将通过反射获得的对象取消装箱到MyEnum

目前,您正在比较对象的相等性,这些对象测试引用的相等性。它们不是同一个对象,因此返回false。

这应该按照您的预期行事:

if (exclusionValue == (MyEnum)propertyValue)

或者,您可以改为调用Equals方法:

if (exclusionValue.Equals(propertyValue))

这将调用Enum.Equals方法,这将做正确的事。