リフレクションを使用して汎用 C# オブジェクトを動的に作成します
C# 開発では、汎用オブジェクトを動的に作成することが必要になることがよくあります。型情報が常に入手できるとは限らないため、これにより課題が生じます。この記事では、リフレクションと Activator.CreateInstance
メソッドを使用してこの問題を解決する方法を検討します。
次のクラスがあるとします:
<code class="language-csharp">public class Item { } public class Task<T> { } public class TaskA<T> : Task<T> { } public class TaskB<T> : Task<T> { }</code>
私たちの目標は、完全修飾型名 ("namespace.TaskA" や "namespace.TaskB" など) を表す文字列に基づいて TaskA
または TaskB
のインスタンスを動的に作成することです。
この解決策は次の手順で達成できます:
Task<T>
) を取得します。 new Type[] { typeof(Item) }
)。 Type.MakeGenericType
または TaskA
) を生成するには、TaskB
を使用します。 Activator.CreateInstance
を使用して汎用オブジェクトをインスタンス化します。 たとえば、リフレクションを使用して TaskA<Item>
オブジェクトを作成します。
<code class="language-csharp">var taskType = typeof(Task); Type[] typeArgs = { typeof(Item) }; var makeme = taskType.MakeGenericType(typeArgs); object o = Activator.CreateInstance(makeme);</code>
型名が文字列として指定されている場合は、次のメソッドを使用できます:
<code class="language-csharp">var taskType = Type.GetType("namespace.TaskA`1"); //注意`1`表示泛型参数个数 Type[] typeArgs = { typeof(Item) }; var makeme = taskType.MakeGenericType(typeArgs); object o = Activator.CreateInstance(makeme);</code>
このテクノロジーにより、型名に基づいてジェネリック オブジェクトを動的にインスタンス化でき、実行時に未知のジェネリック型を処理するための柔軟で強力なソリューションが提供されます。 Type.GetType
メソッドには完全な名前空間情報が必要であり、TaskA
の後の 1
はジェネリック クラスに型パラメーターがあることを示していることに注意してください。
以上がリフレクションを使用して汎用 C# オブジェクトを動的に作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。