ホームページ >バックエンド開発 >C++ >リフレクションを使用して汎用 C# オブジェクトを動的に作成するにはどうすればよいですか?

リフレクションを使用して汎用 C# オブジェクトを動的に作成するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-22 09:47:09444ブラウズ

How Can I Dynamically Create Generic C# Objects Using Reflection?

リフレクションを使用して汎用 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 のインスタンスを動的に作成することです。

この解決策は次の手順で達成できます:

  1. 基本型 (Task<T>) を取得します。
  2. 配列として提供される型パラメーターを定義します (たとえば、new Type[] { typeof(Item) })。
  3. 特定のタイプ (Type.MakeGenericType または TaskA) を生成するには、TaskB を使用します。
  4. 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。