我正在使用反射来从对象中检索属性的值。值是枚举:
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; }
}
修改
它们只会是值类型(没有结构)或字符串。
答案 0 :(得分:1)
您需要将通过反射获得的对象取消装箱到MyEnum
。
目前,您正在比较对象的相等性,这些对象测试引用的相等性。它们不是同一个对象,因此返回false。
这应该按照您的预期行事:
if (exclusionValue == (MyEnum)propertyValue)
或者,您可以改为调用Equals
方法:
if (exclusionValue.Equals(propertyValue))
这将调用Enum.Equals
方法,这将做正确的事。