关于.net:为什么基类的成员与派生类中的同一成员不同?

Why is a member of base class different from the same member in derived class?

这是此问题的后续问题:lambda表达式未返回预期的memberinfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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是一个接口时,或者当Humanname是抽象的/虚拟的时,必须存在差异。但是为什么对于密封型呢?难道Manname不是Humanname吗?

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


它们的ReflectedType属性不同:

The ReflectedType property retrieves the Type object that was used to obtain this instance of MemberInfo. This may differ from the value of the DeclaringType property if this MemberInfo object represents a member that is inherited from a base class.

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

编辑:在实现相等运算符的原因方面:在对象之间可能存在可区分但不是"主要"差异的情况下,计算==的含义始终是一个微妙的设计决策。在这里,提供不同的IEqualityComparer实现是有用的,但这当然不适用于操作员本身。

一般来说,如果x == y是真的,那么x.Fooy.Foo在任何财产上都不一样是很不寻常的。我不能立即想到框架中发生的任何情况。