为什么是基类的一个成员从派生的类相同的构件不同?(Why is a member of base c

2019-09-01 08:10发布

这是一个后续到这样一个问题: Lambda表达式不返回预期的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是一个接口,或当nameHuman是抽象/虚。 但是,为什么会这样的密封类型? 没有nameMan正是nameHuman

澄清:作为乔恩说,他们ReflectedType s为不同的。 ReflectedType决定接口成员或重写成员的平等时,因为它们是不同的平等应该来得心应手。 但我不认为它应该被视为决定像上面的简单的情况下平等。 可能是设计团队希望是一致的。 只是不知道什么理由开车框架设计者考虑ReflectedType属性决定同一个成员的平等跨越多个类。

Answer 1:

它们的区别在于它们ReflectedType属性:

该ReflectedType属性检索来获得的MemberInfo的此实例的类型对象。 这可以从DeclaringType属性的值,如果这的MemberInfo对象表示从基类继承的成员是不同的。

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

编辑:为什么等于运算来实现这样的术语:它总是一个微妙的设计决策,制定出什么==应该意味着,在情况下可能会有区别的,但对象之间没有“主”的差异。 这是提供不同IEqualityComparer的实现是有用的,但当然,对于运营商自己不工作。

在一般情况下,如果x == y为真,那么这是相当不寻常的x.Foo是不同的,以y.Foo任何财产。 我不能马上想到哪里,在框架发生的任何情况。



文章来源: Why is a member of base class different from the same member in derived class?