2010-05-01 75 views
5

我們假設有一個具有虛擬屬性的類(我們稱之爲'P')。它在派生類中被覆蓋。現在我想用這樣的東西: obj.GetType().GetProperty("P")獲取有關重寫屬性的信息。由於有兩個「P」屬性(基本和覆蓋),這種搜索是非常模糊的。所以我輸入:obj.GetType().GetProperty("P", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)C#中的派生類反射

它只返回覆蓋「P」,但如果我不能在編譯時猜測是否有重寫?後者的調用將返回null。如果繼承層次更大,則情況更加複雜。

換句話說,我想獲得'最高'覆蓋可用,否則 - 基本屬性。達到目標的最簡潔的方法是什麼?目前我只知道一個是通過所有屬性並檢查名稱和聲明類型。

回答

3

基本上,我同意馬丁:BindingFlags.FlattenHierarchy可能是你需要的。不過,我認爲這些都是使用BindingFlags.DeclaredOnly代替,即

Type type = obj.GetType(); 
var c = type.GetProperty("P", BindingFlags.FlattenHierarchy | 
           BindingFlags.Public | 
           BindingFlags.Instance); 

然後可以使用c.DeclaringType找出在哪個級別的財產被宣佈。

如果指定DeclaredOnly和類型type不聲明(但繼承)Pnull將被退回。

+0

是的,這是我需要做的事情。您提供的示例用法完全是應該如何完成的。謝謝! – pbalaga 2010-05-01 12:04:25

1

您是否試圖添加BindingFlags.FlattenHierarchy

+0

謝謝,這是我需要的。對msdn的FlattenHierarchy的描述對我來說似乎有誤導性,所以我沒有考慮到它。它說關於受保護的靜態成員,我不想匹配。現在,在準備快速測試之後,我可以看到BindingFlags.Static |無論如何(另外)必須指定BindingFlags.NonPublic與受保護的靜態成員一起生效。 感謝您指出應該是顯而易見的事情。 – pbalaga 2010-05-01 11:59:56