4

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

s也是MethodInfo如此。

Human我可以理解什么时候是接口,或者什么时候nameHuman抽象/虚拟的,必须有所不同。但是为什么密封类型会如此呢?不正是nameof吗?MannameHuman

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

4

1 回答 1

7

它们的ReflectedType属性不同:

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

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

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

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

于 2013-04-29T10:26:32.623 回答