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

本文关键字:未知 类型 反射 | 更新日期: 2023-09-27 18:22:39

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

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; }
}

编辑

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

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

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

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

这应该如您所期望的那样:

if (exclusionValue == (MyEnum)propertyValue)

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

if (exclusionValue.Equals(propertyValue))

它将调用Enum.Equals方法,它将执行正确的操作。