2010-03-02 88 views
1

我有一個ASP.NET 3.5中的網頁,它將動態創建WebControl。它將要創建的WebControls將以其完全限定的路徑(即 - System.Web.UI.WebControls.whatever)而爲人所知。原因是因爲我允許用戶決定網頁上的控件。當然,比這更復雜,但簡而言之就是這樣。從完全限定的路徑創建WebControls(程序集名稱?)

簡單地說 - 我如何通過完全合格的路徑在網頁上創建WebControl?

我意識到,答案可能會最終使用反射,但我沒有使用反射的經驗,我不想通過犯新手錯誤在自己的腳下拍攝自己。

+0

是在編譯時已知的所有可能的類型?這會給你更多的選擇。反射是絕對有可能的,但如果你必須在每個webcontrol上設置很多單獨的屬性,它可能最終成爲一個麻煩。 – 2010-03-02 18:38:36

+0

你說得很好,而且我知道如果我朝這個方向行事,我必須在某個時候處理這​​個問題。真相被告知,我仍然不相信我會追求這條道路,因爲正如你所說的,我將在網絡控制上訪問許多屬性,我不確定在嘗試添加多少複雜性時訪問它們。 – Jagd 2010-03-02 19:32:53

回答

3

嘗試的字符串來調用這個方法:Activator.CreateInstance(Type.GetType("TypeName"));

其中typeName爲完全合格的名稱,包括裝配。在我的情況下,它看起來是這樣的:

Activator.CreateInstance(Type.GetType("System.Web.UI.WebControls.Label, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")); 

,以確保有關全名的情況下,嘗試輸出typeof(System.Web.UI.WebControls.Label).FullName,並用它作爲圖案

+0

唯一要記住的是'Activator'只適用於公共類實現一個默認的構造函數,即一個無參數的構造函數。 – 2010-03-02 18:31:14

+0

我不同意。如果你設法從Assembly對象中挖出Type對象,它可以實例化私有類。關於無參數構造函數也是不正確的,你可以將參數傳遞給構造函數作爲第二個參數給CreateInstance – Andrey 2010-03-02 18:37:51

+0

這是有效的。謝謝! – Jagd 2010-03-02 19:05:39

1
object widget = Activator.CreateInstance (Assembly.GetType (name)); 

其中名稱是完全合格的類型

+0

唯一要記住的是'Activator'只適用於實現默認構造函數的公共類,也就是無參數構造函數。 – 2010-03-02 18:30:42

+0

我覺得這很接近,但還沒有那麼完美。 Assembly沒有GetType()的靜態方法,但是Assembly的一個實例當然是。 – Jagd 2010-03-02 18:57:37

+0

您還可以通過typeof(x)來獲取Activator.CreateInstance所需的類型。然後x等於System.Web.UI.WebControls.Label,System.Web.UI.WebControls.Textbox或任何其他想要動態創建的類型 – JDMX 2010-03-02 19:01:28

相關問題