実行時にクラスの名前を知っているという事実に基づいて、クラスのインスタンスを作成する方法はありますか?基本的に、私は文字列にクラスの名前を入れます。
8 に答える
Activator.CreateInstanceメソッドを見てください。
とてもシンプルです。Car
クラス名がで、名前空間がであると仮定し、タイプ のオブジェクトを返すVehicles
パラメータを渡します。このように、任意のクラスの任意のインスタンスを動的に作成できます。Vehicles.Car
Car
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
完全修飾名(つまり、この場合Vehicles.Car
) が別のアセンブリにある場合、Type.GetType
は null になります。このような場合、すべてのアセンブリをループして、Type
. そのためには、以下のコードを使用できます
public object GetInstance(string strFullyQualifiedName)
{
Type type = Type.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
type = asm.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
}
return null;
}
パラメーター化されたコンストラクターを呼び出したい場合は、次のようにします。
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
それ以外の
Activator.CreateInstance(t);
私はこの方法をうまく使用しました:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
返されたオブジェクトを目的のオブジェクトタイプにキャストする必要があります。
おそらく私の質問はもっと具体的だったはずです。私は実際に文字列の基本クラスを知っているので、次のように解決しました:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
Activator.CreateInstance クラスには、同じことをさまざまな方法で実現するさまざまなメソッドがあります。オブジェクトにキャストすることもできましたが、上記が私の状況に最も役立ちます。
私はゲームに遅れていることを知っています...しかし、あなたが探している解決策は、上記の組み合わせであり、インターフェイスを使用して、オブジェクトのパブリックにアクセス可能な側面を定義することです。
次に、この方法で生成されるすべてのクラスがそのインターフェースを実装する場合、インターフェース型としてキャストして、結果のオブジェクトを操作するだけです。
たとえば、さまざまな型の値をデータベース フィールド (文字列として格納) に格納し、型名 (つまり、String、bool、int、MyClass) を持つ別のフィールドがある場合、そのフィールド データから、考えられるように、上記のコードを使用して任意のタイプのクラスを作成し、最初のフィールドの値を入力します。もちろん、これは、文字列を正しい型に解析する方法を持っている格納する型に依存します。これを何度も使用して、ユーザー設定をデータベースに保存しました。
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
なぜこのようなコードを書きたいのですか?クラス「ReportClass」が利用可能な場合は、以下に示すように直接インスタンス化できます。
ReportClass report = new ReportClass();
このコードReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
は、必要なクラスを利用できないが、メソッドを動的にインスタンス化または呼び出したい場合に使用されます。
つまり、アセンブリを知っているときに便利ですが、コードを書いている間はクラスを利用できませReportClass
ん。