Почему член базового класса отличается от того же члена в производном классе?

Это продолжение этого вопроса: лямбда-выражение не возвращает ожидаемого 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 это интерфейс, или когда name из Human является абстрактным / виртуальным. Но почему это так для закрытых типов? не name из Man именно так name из Human?

Пояснение: как Джон говорит их ReflectedTypeс разные. ReflectedType равенство должно пригодиться при принятии решения о равенстве членов интерфейса или переопределенных членов, поскольку они различны. Но я не думаю, что это следует учитывать для принятия решения о равенстве простых случаев, как указано выше. Может быть, команда дизайнеров хотела быть последовательной. Просто интересно, какое обоснование заставило дизайнеров фреймворков задуматься ReflectedType свойство в решении равенства одного и того же члена, охватывающего несколько классов.

1 ответ

Решение

Они отличаются по своему ReflectedType имущество:

Свойство ReflectedType извлекает объект Type, который использовался для получения этого экземпляра MemberInfo. Это может отличаться от значения свойства DeclaringType, если этот объект MemberInfo представляет член, который унаследован от базового класса.

Так что, если вы распечатываете m1.ReflectedType, это должно напечатать Human, Если вы распечатываете m2.ReflectedType, это должно напечатать Man,

РЕДАКТИРОВАТЬ: с точки зрения того, почему оператор равенства реализован таким образом: это всегда деликатное проектное решение, чтобы выяснить, что == должно означать, в случае, когда могут быть различимые, но не "первичные" различия между объектами. Это где предоставление разных IEqualityComparer реализации полезны, но, конечно, это не работает для самих операторов.

В общем, если x == y верно, то это довольно необычно для x.Foo отличаться от y.Foo за любую недвижимость. Я не могу сразу думать о каких-либо случаях, когда это происходит в рамках.

Другие вопросы по тегам