如何将相同的PropertyInfo与不同的ReflectedType值进行比较?

时间:2016-04-22 16:51:39

标签: c# .net reflection

这是一个简单的测试,证明了这个问题:

class MyBase { public int Foo { get; set; } }    
class MyClass : MyBase { }    
[TestMethod]
public void TestPropertyCompare()
{
    var prop1 = typeof(MyBase).GetProperty("Foo");
    var prop2 = typeof(MyClass).GetProperty("Foo");
    Assert.IsTrue(prop1 == prop2); // fails
    //Assert.IsTrue(prop1.Equals(prop2)); // also fails
}

我需要一个比较方法,它将确定这两个属性实际上代表相同的属性。这样做的正确方法是什么?

特别是我想检查属性是否实际来自基类而不是以任何方式改变,例如override(使用override int Foo),隐藏(使用new int Foo)属性,接口属性(即显式实现)在派生类ISome.Foo)中或在使用MyBase.Foo时导致不调用instanceOfDerived.Foo的任何其他方式。

1 个答案:

答案 0 :(得分:6)

ReflectedType始终返回您要反思的类型。 DeclaringType告诉声明属性的类型。所以你需要用以下代码替换:

public static class TypeExtensions
{
    public static bool PropertyEquals(this PropertyInfo property, PropertyInfo other)
    {
         return property.DeclaringType == other.DeclaringType
                    && property.Name == other.Name;
    }
}

用法:

var prop1 = typeof(MyBase).GetProperty("Foo");
var prop2 = typeof(MyClass).GetProperty("Foo");
var isSame = prop1.PropertyEquals(prop2); //will return true

编辑:在评论中删除了PropertyType检查@Rob中的建议。