2013-04-29 137 views
4

這是一個後續到這樣一個問題: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是一個接口,或者當Humanname是抽象/虛擬時,必須有差別。但爲什麼密封類型呢?是不是nameMan正好nameHuman

澄清:由於Jon說他們的ReflectedType s是不同的。 ReflectedType在決定界面成員或被覆蓋成員的平等時應該來得方便,因爲他們是不同的。但我認爲不應該考慮決定上述簡單案例的平等。可能是設計團隊想要保持一致。只是想知道什麼原因促使框架設計者在決定跨越多個類的同一成員的平等時考慮ReflectedType屬性。

回答

7

它們的區別在於它們ReflectedType屬性:

的ReflectedType屬性檢索來獲得的MemberInfo的此實例的類型對象。如果此MemberInfo對象表示從基類繼承的成員,則這可能與DeclaringType屬性的值不同。

所以,如果你打印出m1.ReflectedType,它應該打印Human。如果您打印出m2.ReflectedType,則應打印Man

編輯:關於等式操作符爲什麼這樣實現的問題:它總是一個微妙的設計決定,以確定什麼==應該是什麼意思,在這種情況下,對象之間可能有區別但不是「主要」區別。這是提供不同的IEqualityComparer實現有用的地方,但當然這對於運營商本身並不適用。

一般而言,如果x == y爲真,那麼對於任何財產x.Fooy.Foo都是不同尋常的。我不能立即想到任何發生在框架中的情況。

+0

喬恩,我明白了,他們可能在許多其他方面有所不同,但我的問題更像是爲什麼C#/。NET團隊決定如此。我會讓我的問題清楚 – nawfal 2013-04-29 10:27:56

+1

@nawfal:我想有些情況下知道哪種類型的信息是有用的。老實說,我不確定他們*在許多其他方面會有什麼不同。如果你的問題真的是「爲什麼ReflectedType」存在?那就完全不同了。 – 2013-04-29 10:30:38

+1

還有一點:http://startbigthinksmall.wordpress.com/2008/12/10/retrieving-the-base-definition-for-a-propertyinfo-net-reflection-mess/ – Ani 2013-04-29 12:18:28

相關問題