1. ホーム
  2. c#

[解決済み] リフレクションを使用して汎用C#オブジェクトを動的に作成する方法は?重複

2022-05-15 03:28:37

質問

C#では、次のようなオブジェクトがあります。

public class Item
{ }

public class Task<T>
{ }

public class TaskA<T> : Task<T>
{ }

public class TaskB<T> : Task<T>
{ }

C#のリフレクションを使って、TaskAやTaskBを動的に作りたいのですが( アクティベータ.CreateInstance ). しかし、私は事前に型を知らないので、私は"namespace.TaskA"や"namespace.TaskAB"などの文字列に基づいたタスクAを動的に作成する必要があります。

どのように解決するのですか?

次のことを確認してください。 記事 と、この 簡単な例 . あなたのクラスへの同じのクイック翻訳...

var d1 = typeof(Task<>);
Type[] typeArgs = { typeof(Item) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);

あなたの編集によると:その場合、あなたはこれを行うことができます...

var d1 = Type.GetType("GenericTest.TaskA`1"); // GenericTest was my namespace, add yours
Type[] typeArgs = { typeof(Item) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);

ジェネリッククラスの名前を backtick1 とした理由は、以下の通りです。 この記事 .

注意:ジェネリッククラスが複数の型を受け付ける場合、型名を省略する場合などにはカンマを入れる必要があります。

Type type = typeof(IReadOnlyDictionary<,>);