天天看點

C#基礎知識回顧-- 反射(3)          

擷取Type對象的構造函數:

  前一篇因為篇幅問題因為篇幅太短被移除首頁,反射這一塊還有一篇“怎樣在程式集中使用反射”,

其他沒有什麼可以寫的了,前兩篇主要是鋪墊,在實際應用中,主要是最後兩篇。其實寫完反射,

我也考慮重新把委托重新寫下,現在想想确實太過單一和簡單了。我會把實際開發中委托的例子多寫幾個

, 以便以了解。如果這幾篇C#的基礎對您有所幫助的話,請點選推薦。謝謝您的支援……

  好了,不廢話了,在前面例子中,由于MyClass類型的對象是顯示建立的,是以使

用反射技術來調用MyClass上的方法沒有任何優勢--以普通的方式調用對象上的方法會簡單的多。但是,

如果對象是在運作時動态建立的,反射的功能就顯示出來了。在這種情況下,需要首先擷取一個構造函

數清單,然後再調用清單中的某個構造函數,建立一個該類型的執行個體。通過這種機制,可以在運作時執行個體

化任意類型的對象而不必在聲明中指定。

  為了獲得某個類型的構造函數,需要調用Type對象上的GetConstructors()。常用形式為:

  ConstructorInfo[] GetConstructors()

  該方法傳回一個描述構造函數的ConstructorInfo對象數組。ConstructorInfo中常用的

是GetParamters()方法,該方法傳回給定構造函數的參數清單。

  一旦找到了合适的構造函數,就調用ConstructorInfo定義的Invoke()方法來建立對象:

  object Invoke(object[] args)

  需要傳遞給此方法的所有參數都在args中指定。如果不需要參數,args必須為null。另外,

args必須包含與參數個數相同的元素,并且實參的類型必須與形參的類型相容。Invoke()方法傳回

的是指向新構造對象的引用。

例子:

測試對象類

使用反射:

運作結果為:

C#基礎知識回顧-- 反射(3)          

  本例中,找到了一個兩個參數的構造函數,那麼使用下面的語句執行個體化了一個該類型的對象:

object reflectOb=ci[x].Invoke(consargs);

調用Invoke()方法後,reflectOb将引用一個MyClass類型的對象。此後,程式将執行

reflectOb上的方法。

注意:本例為了簡單起見,假設了一個使用兩個參數的構造函數,并且兩個參數都為int類型

。但在實際的應用程式中,必須檢驗每一個參數的類型。