相同的值,反射中的未知类型相等
本文关键字:未知 类型 反射 | 更新日期: 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
方法,它将执行正确的操作。