擷取Type對象的構造函數:
前一篇因為篇幅問題因為篇幅太短被移除首頁,反射這一塊還有一篇“怎樣在程式集中使用反射”,
其他沒有什麼可以寫的了,前兩篇主要是鋪墊,在實際應用中,主要是最後兩篇。其實寫完反射,
我也考慮重新把委托重新寫下,現在想想确實太過單一和簡單了。我會把實際開發中委托的例子多寫幾個
, 以便以了解。如果這幾篇C#的基礎對您有所幫助的話,請點選推薦。謝謝您的支援……
好了,不廢話了,在前面例子中,由于MyClass類型的對象是顯示建立的,是以使
用反射技術來調用MyClass上的方法沒有任何優勢--以普通的方式調用對象上的方法會簡單的多。但是,
如果對象是在運作時動态建立的,反射的功能就顯示出來了。在這種情況下,需要首先擷取一個構造函
數清單,然後再調用清單中的某個構造函數,建立一個該類型的執行個體。通過這種機制,可以在運作時執行個體
化任意類型的對象而不必在聲明中指定。
為了獲得某個類型的構造函數,需要調用Type對象上的GetConstructors()。常用形式為:
ConstructorInfo[] GetConstructors()
該方法傳回一個描述構造函數的ConstructorInfo對象數組。ConstructorInfo中常用的
是GetParamters()方法,該方法傳回給定構造函數的參數清單。
一旦找到了合适的構造函數,就調用ConstructorInfo定義的Invoke()方法來建立對象:
object Invoke(object[] args)
需要傳遞給此方法的所有參數都在args中指定。如果不需要參數,args必須為null。另外,
args必須包含與參數個數相同的元素,并且實參的類型必須與形參的類型相容。Invoke()方法傳回
的是指向新構造對象的引用。
例子:
測試對象類
使用反射:
運作結果為:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIWMzQjNlRDNwMDOxgjMxQGMlVWMkZmM1IzM0UzM0UTYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
本例中,找到了一個兩個參數的構造函數,那麼使用下面的語句執行個體化了一個該類型的對象:
object reflectOb=ci[x].Invoke(consargs);
調用Invoke()方法後,reflectOb将引用一個MyClass類型的對象。此後,程式将執行
reflectOb上的方法。
注意:本例為了簡單起見,假設了一個使用兩個參數的構造函數,并且兩個參數都為int類型
。但在實際的應用程式中,必須檢驗每一個參數的類型。