2013-03-18 36 views
2

我目前正在嘗試學習反射,並且看到了一些使用GetConstructor的例子,我猜想它是我需要理解的基本功能之一,能夠開始使用反射工作。我認爲我明白代碼的作用以及如何使用它。從MSDN爲什麼type.getConstructor將一個類型數組作爲inparameter?

代碼示例

http://msdn.microsoft.com/en-us/library/h93ya84h.aspx

types[0] = typeof(int); 
// Get the constructor that takes an integer as a parameter. 
ConstructorInfo constructorInfoObj = myType.GetConstructor(types); 

我的代碼唯一的問題是,我不明白爲什麼我需要創建一個虛擬類型的數組,以便能夠使用GetConstructor方法(除了「該方法是以這種方式構造的」)。在我看來,邏輯inparameter是一個整數,它包含我想通過反射獲得的構造函數的索引。如果存在某個原因,是否有人可以解釋爲什麼類型數組用作inparameter?

回答

2

它需要一個Type[]來搜索具有特定簽名的constructor

array represent the order of Parameter鍵入Constructor

接受按,如果你已經通過類似

Type[] types = new Type[1]; 
types[0] = typeof (long); 

ConstructorInfo constructorInfo = typeof (MyClass1).GetConstructor(types); 

constructorInfo MSDN上

public class MyClass1 
    { 
     public MyClass1(){} 
     public MyClass1(int i){} 
    } 

給出的例子會一直null,因爲沒有constructor存在以long作爲參數

4

構造函數通過簽名進行搜索,即通過參數類型的有序列表進行搜索。這就是爲什麼你需要傳遞一個構造函數參數類型的數組。在我看來,這是非常合乎邏輯的。

1

因爲構造函數可以有零個或多個參數。類型列表告訴反射哪個構造函數得到。

1

[..]我不理解爲什麼需要創建一個虛擬類型的數組是 能夠使用GetConstructor方法(除了從「該方法是在該方式構造 」)

通常情況下,反射可以解決像「從已知具有構造函數的類型創建對象」,該構造函數接受一個int,然後是一個字符串,然後是一個double。考慮到這一點,有意義的是提供一組參數類型作爲輸入。既然你正在尋找一個單一的構造函數,你可能希望消除多少歧義?

在我看來,在邏輯參數將是一個整數,包含 我試圖通過反射得到的構造函數的索引。

你認爲這個指數代表什麼?不保證會員按照源編程語言中聲明的順序被反射API訂購。 在任何情況下,它看起來像你想要的枚舉/索引到一個構造函數的數組。 Type.GetConstructors將有助於此。

相關問題