【问题标题】:Same value, unknown type equality in reflection反射中的相同值,未知类型相等
【发布时间】:2014-09-18 22:48:46
【问题描述】:

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

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)

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

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

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

编辑

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

【问题讨论】:

    标签: c# reflection enums


    【解决方案1】:

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

    目前您正在比较对象的相等性,这会测试 reference 相等性。它们不是同一个对象,所以它返回 false。

    这应该和你预期的一样:

    if (exclusionValue == (MyEnum)propertyValue)
    

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

    if (exclusionValue.Equals(propertyValue))
    

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

    【讨论】:

    • 已编辑 - 您可以使用 Equals
    • 非常感谢。所以我说Equals 方法将首先检查它是值类型还是引用类型,然后根据该答案按值或引用进行比较是否正确,而== 运算符只会按引用进行比较(对于object)?
    • Equals== 都是可覆盖的方法,所以它有点依赖。除非被覆盖,== 会检查引用相等性(当然,值类型除外)。 Equals 通常检查值是否相等。 == 在某些引用类型(例如string)中被覆盖以检查值是否相等。
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多