3

次のコード行を検討してください。

classA<classB> C;

代わりに System.Reflection を使用して、実行時に C のインスタンスを作成したいと考えています。そのためには、実行時に classA と classB の Type を知る必要があります。

classBの型を取得する方法を知っています

Type classBType = AssemblyContaingClassB.GetType("namespace.classB");

Q1> このclassBTypeを使用してclassAの型を取得するにはどうすればよいですか?

Q2> 実行時にインスタンスを作成するには、次のコード行を呼び出すことを理解しています。

object C = Activator.CreateInstance(TypeName);

Cのインスタンスを作成するには、上記のコードでどの TypeName を使用する必要がありますか? このインスタンスを作成するのに十分なクラスAのタイプ

この質問が基本的すぎる場合は、事前に感謝し、お詫び申し上げます。私はC#が初めてです。

編集:

問題は修正済みです。pswg の回答から、ジェネリック パラメータを持つクラスの型を取得する際に問題がありました。ジェネリック パラメータの型を取得する方法に関する解決策は、こちらにあります。その後、pswgの回答が示唆することとその作業を行いました。

4

2 に答える 2

8

MakeGenericTypeopen-genericclassA<>タイプでメソッドを使用できます。

Type classBType = ... get from somewhere at runtime
Type classAType = typeof(classA<>).MakeGenericType(classBType);
object classAInstance = Activator.CreateInstance(classAType);

はジェネリックMakeGenericTypeを閉じ、classA<>インスタンス化できるようにします。

于 2013-07-11T06:03:15.453 に答える
4

最新の更新を考えると、問題はclassA<>実行時にタイプをロードしているようです。名前の競合を回避するために、C# コンパイラは、 がジェネリック型パラメーターの数であるような名前を生成するため、リフレクションによって型を取得するにSimpleClassName`Nは、 name を使用します。その後、次のメソッドを使用するだけです。NclassA<>namespace.classA`1MakeGenericType

var classAType = AssemblyContaingClassA.GetType("namespace.classA`1");
var classBType = AssemblyContaingClassB.GetType("namespace.classB");
var genericType = classAType.MakeGenericType(classBType);

object instance = Activator.CreateInstance(genericType);

もちろん、実行時に型をロードする必要typeofない限り、演算子を使用してコンパイル時に型を取得する方が簡単で安全です。

var classAType = typeof(classA<>);
var classBType = typeof(classB);
var genericType = classAType.MakeGenericType(classBType);

object instance = Activator.CreateInstance(genericType);
于 2013-07-11T06:02:36.313 に答える