2013-03-16 11 views
19

私には利用可能かどうかはわかりませんが、存在するかどうか、そしてその動作方法を知りたいだけです。だから私の質問です:文字列変数に名前を持つクラスのオブジェクトインスタンスを作成します

私は自分の2-3カスタムモデルクラスがあります。たとえば、顧客、 従業員と製品。今は文字列にクラス名があります。文字列に入っているクラス名 に基づいてオブジェクトを作成し、 VIEWに戻る必要があります。どうすればこれを達成できますか?

最も簡単な方法は、アクティベーターを使用することです

+0

をしていますが、リフレクションを使用している場合、一般的なルールとして、あなたが何か間違ったことをやっているかもしれない(がありますあなたは反射が必要な場合がありますが、それは一般的ではありません)。 –

答えて

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を与えなければなりません。どんなクラスでもかまいません。 – Dhwani

+0

私はまさにあなたがしようとしたことをしました。私が言及したように、クラス名の他に名前空間(文字列として)が必要です。それらを両方持つことで、私が示したように、そのクラスのオブジェクトのインスタンスを作成することができます。明確にするために答えを編集します。ありがとうございました –

+4

最後のコードを読むべきではありません: "var myObj = Activator.CreateInstance(Type.GetType(namespaceName +"。 "className));" (ドット抜け?) – JCCyC

2

...私はIF ELSE文のオプションを知っているが、私はより良い、「ダイナミック」方法を試してみたいです。クラス名を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(); 

これは何を探してるんですが反映された作品。..

よろしくアビ

関連する問題