.net 如何比较相同的PropertyInfo与不同的ReflectedType值?

6bc51xsx  于 2023-04-13  发布在  .NET
关注(0)|答案(1)|浏览(115)

下面是一个简单的测试来演示这个问题:

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 int Foo),隐藏(使用new int Foo)属性,接口属性(即在派生类ISome.Foo中显式实现)或任何其他方式导致在使用instanceOfDerived.Foo时不调用MyBase.Foo

irlmq6kh

irlmq6kh1#

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
  • 编辑:删除了评论中@Rob建议的PropertyType检查。*

相关问题