【问题标题】:Why is a member of base class different from the same member in derived class?为什么基类的成员与派生类中的同一成员不同?
【发布时间】:2013-04-29 10:22:38
【问题描述】:

这是对这个问题的跟进:Lambda expression not returning expected MemberInfo

class Human
{
    public string name { get; set; }
}

class Man : Human
{

}

var m1 = typeof(Human).GetProperty("name");
var m2 = typeof(Man).GetProperty("name");

//m1 != m2 why?

MethodInfos 也是如此。

我可以理解,当Human 是一个接口,或者nameHuman 是抽象/虚拟时,肯定会有区别。但是为什么密封类型会如此呢? nameMan 不正是 nameHuman 吗?

澄清:正如 Jon 所说,他们的 ReflectedTypes 是不同的。 ReflectedType 在决定接口成员或覆盖成员的相等性时应该派上用场,因为它们是不同的。但是我认为不应该考虑决定上述简单情况的相等性。可能是设计团队想要保持一致。只是想知道是什么原理促使框架设计人员在决定跨多个类的同一成员是否相等时考虑ReflectedType 属性。

【问题讨论】:

    标签: .net inheritance propertyinfo methodinfo fieldinfo


    【解决方案1】:

    它们的 ReflectedType 属性不同:

    ReflectedType 属性检索用于获取此 MemberInfo 实例的 Type 对象。如果此 MemberInfo 对象表示从基类继承的成员,则这可能与 DeclaringType 属性的值不同。

    所以如果你打印出m1.ReflectedType,它应该打印出Human。如果你打印出m2.ReflectedType,它应该打印出Man

    编辑:关于为什么以这种方式实现相等运算符:在对象之间可能存在可区分但不是“主要”差异的情况下,弄清楚== 应该意味着什么总是一个微妙的设计决定。这就是提供不同的IEqualityComparer 实现有用的地方,但当然这对操作员本身不起作用。

    一般来说,如果x == y 为真,那么对于任何属性,x.Fooy.Foo 不同是很不寻常的。我无法立即想到框架中发生这种情况的任何情况。

    【讨论】:

    • 乔恩,我明白这一点,它们可能在许多其他方面有所不同,但我的问题更像是为什么 C#/.NET 团队会这样决定。我会把我的问题说清楚
    • @nawfal:我想在某些情况下,了解向哪种类型询问信息很有用。老实说,我不确定它们在许多其他方面有所不同。如果您的问题真的是“为什么ReflectedType 存在?”那么情况就大不一样了。
    • @JonSkeet,知道它们的反射类型确实很有用,但我不知道为什么它被认为是平等的。我认为m1 = new MemberInfo { Name = "name", ReflectedType = Human } 应该等于m2 = new MemberInfo { Name = "name", ReflectedType = Man }
    • @nawfal:查看我的编辑。出于兴趣,您能想到== 为可区分值返回 true 的示例吗?我唯一能想到的就是 +0 和 -0 用于浮点结构......我想不出类的类似示例。
    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 2013-02-05
    • 2022-01-25
    • 2016-02-14
    • 2015-11-01
    • 2012-01-03
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多