代码之家  ›  专栏  ›  技术社区  ›  astef

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

  •  6
  • astef  · 技术社区  · 10 年前

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

    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 )或任何其他导致不打电话的方式 MyBase.Foo 什么时候 instanceOfDerived.Foo 已使用。

    1 回复  |  直到 10 年前
        1
  •  6
  •   jgauffin    10 年前

    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检查建议。

    推荐文章