2009-06-22 81 views
4

鑑於follwing類識別抽象成員 - 我想知道這兩個構件的抽象:如何通過反射

abstract class Test 
{ 
    public abstract bool Abstract { get; set; } 
    public bool NonAbstract { get; set; } 
} 

var type = typeof(Test); 
var abs = type.GetProperty("Abstract"); 
var nonAbs = type.GetProperty("NonAbstract"); 

// now, something like: 
if(abs.IsAbstract) ... 

不幸的是,沒有像IsAbstract - 屬性。
我需要選擇一個類的所有非抽象的字段/屬性/方法 - 但沒有BindingFlags也縮小了選擇範圍。

回答

12

一個屬性實際上是一些'語法糖',並通過2個方法實現:一個getter方法和一個setter方法。

所以,我認爲你應該能夠確定一個屬性通過檢查是抽象的,如果getter和/或setter是抽象的,是這樣的:

PropertyInfo pi = ... 

if(pi.GetSetMethod().IsAbstract) 
{ 
} 

而且,據我所知,一個字段不能抽象。 ;)

+0

是的,抽象領域是愚蠢的 - 謝謝你的答案。您的解決方案也適用於私人物業,這對我很重要。 – tanascius 2009-06-22 07:20:57

1

首先:字段不能是抽象的,因爲它們都是字段本身。

接下來我們注意到屬性(在一個鬆散的意義上!)實際上get_/set_方法在引擎蓋下。

接下來我們檢查什麼確實IsAbstract屬性,看到MethodBase(等MethodInfo)一樣。

最後,我們還記得/知道/找出一個PropertyInfo具有GetGetMethod()GetSetMethod()方法,返回MethodInfo秒,我們就大功告成了,除了在關於繼承等繁瑣的細節填充。

+0

到現在爲止,我沒有嘗試創建抽象領域...... :)我只是寫作比思考更快。感謝您的建議。 – tanascius 2009-06-22 07:22:23