2013-03-16 77 views
19

我不知道我問的東西是否可用,但我只想知道它是否存在以及它是如何工作的。所以這裏是我的問題:在字符串變量中創建其名稱的類的對象實例

我有2-3我自己的自定義模型類。例如,客戶, 員工和產品。現在我有一個字符串中的類名。並根據 這個類名進入一個字符串,我不得不創建它的對象,並且返回一個VIEW爲 。我怎麼能做到這一點?

我知道IF ELSE聲明的選擇,但我想嘗試一個更好的,「動態」的方式...

+0

你所尋找的是反射,但作爲一般規則,如果你使用的是反射,你可能會做錯事(有你需要反思的情況,但並不常見)。 – 2013-03-16 13:29:16

回答

39

具有串類名是不夠的,能夠創建它的實例。 事實上,您將需要包含類名的完整名稱空間來創建對象。

假設你具備以下條件:

string className = "MyClass"; 
string namespaceName = "MyNamespace.MyInternalNamespace"; 

比你可以創建一個類的實例,使用以下任一技術MyNamespace.MyInternalNamespace.MyClass類的對象:

var myObj = Activator.CreateInstance(namespaceName, className); 

或這樣的:

var myObj = Activator.CreateInstance(Type.GetType(namespaceName + "." + className)); 

希望這有助於,請讓我知道如果沒有。

+0

我有一個字符串中的類名。所以基本上我不知道類的類型。那我該如何創建特定類的對象呢?在「MyClass myObj =」我必須給MyClass。 BT可以有任何班級。 – Dhwani 2013-03-18 05:25:29

+0

我做了你想要做的。正如我所提到的除了類名之外,你需要命名空間(作爲一個字符串)。把它們放在一起,你就可以按照我的方式創建這個類的實例。我將編輯答案來澄清。感謝您的支持 – 2013-03-18 12:33:41

+4

不應該讀取最後一個代碼:「var myObj = Activator.CreateInstance(Type.GetType(namespaceName +」。「+ className));」 (丟失點?) – JCCyC 2015-03-10 20:35:43

2

最簡單的方法是使用激活。將類名傳遞給GetType並創建新實例。

ClassInstance s1 = (ClassInstance)Activator.CreateInstance(Type.GetType("App.ClassInstance"));

public class ClassInstance 
{ 
    public string StringData { get; set; } 
} 

問候, 聶

8
string frmName = "frmCustomer"; 
    //WorldCarUI. is the namespace of the form 
    Type CAType = Type.GetType("WorldCarUI." + frmName); 
    var myObj = Activator.CreateInstance(CAType); 
    Form nextForm2 = (Form)myObj; 
    nextForm2.Show(); 

這樣做的作品..

問候阿維

相關問題