web-dev-qa-db-ja.com

文字列変数に名前を持つクラスのオブジェクトインスタンスを作成する

私が尋ねているものが利用可能かどうかわかりませんが、それが存在するかどうか、そしてそれがどのように機能するかを知りたいだけです。だからここに私の質問があります:

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

IF ELSEステートメントのオプションは知っていますが、もっと良い方法を試してみたいと思います」動的 "方法...

19
Dhwani

文字列にクラス名があるだけでは、そのインスタンスを作成するには不十分です。実際のところ、オブジェクトを作成するにはクラス名を含む完全な名前空間が必要です。

次のものがあると仮定します。

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

次の方法のいずれかを使用して、クラスMyNamespace.MyInternalNamespace.MyClassのオブジェクトであるクラスのインスタンスを作成できます。

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

またはこれ:

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

これがお役に立てば幸いです。そうでない場合はお知らせください。

41
Display Name
    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();

これは機能します。

よろしくAvi

9
Avinash

最も簡単な方法は、アクティベーターを使用することです。クラス名をGetTypeに渡し、新しいインスタンスを作成します。

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

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

よろしく、ニック

2
Nik

Activatorクラスは.netでこの作業を行います。この手法は、依存性注入のようなシナリオに非常に役立ちます。

string NameSpace = "ProjectName.YourNameSpace";
string ProbeClass = "CLassName";

ObjectHandle ProberHandle = Activator.CreateInstance(NameSpace, ProbeClass) as ObjectHandle;
ClassName Prober = ProberHandle.Unwrap() as ClassName;

型キャストの前にnwrapを確認してください。そうしないと、変換エラーが発生します。

0