为什么基类的成员与派生类中的同一成员不同?

时间:2013-04-29 10:22:39

标签: .net inheritance propertyinfo methodinfo fieldinfo

这是此问题的后续内容: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?

同样适用于MethodInfo

我可以理解,当Human是一个接口,或者name Human是抽象/虚拟时,必须有区别。但为什么密封型呢? name的{​​{1}} Manname的{​​{1}}完全相同吗?

澄清:正如乔恩所说他们的Human不同。在决定接口成员或被覆盖成员的相等性时,平等的ReflectedType应该派上用场,因为它们是不同的。但我不认为应该考虑决定上述简单案件的平等性。可能是设计团队希望保持一致。只是想知道是什么原因促使框架设计者在决定跨越多个类的相同成员的相等性时考虑ReflectedType属性。

1 个答案:

答案 0 :(得分:7)

他们的ReflectedType属性不同:

  

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

因此,如果您打印m1.ReflectedType,则应打印Human。如果您打印m2.ReflectedType,则应打印Man

编辑:关于为什么以这种方式实现等式运算符:在可能存在可区分但不存在“主要”差异的情况下,确定==应该意味着什么是一个微妙的设计决策。对象。这是提供不同IEqualityComparer实现的用途,但当然这对运营商本身不起作用。

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