ジェネリッククラスのランタイムインスタンス化
この記事では、実行時に決定されたタイプパラメーターを使用して、一般的なクラスをインスタンス化するという課題を調査します。 コンパイル時間の制約のため、ランタイム決定変数を一般的な型パラメーターとして直接使用することは不可能です。コンパイラは、コンパイル時にコンクリートタイプが必要です
Type
これを直接試みると、以下に示すように、コンパイラエラーが発生します。
ソリューションには、反射を活用することが含まれます。次の例はこれを示しています:
<code class="language-csharp">string typeName = "<read type name somewhere>"; // Runtime type name Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error</code>
重要なステップは
を使用することです。このメソッドは、<code class="language-csharp">using System; using System.Reflection; public class Generic<T> { public Generic() { Console.WriteLine($"T={typeof(T)}"); } } class Test { static void Main() { string typeName = "System.String"; Type typeArgument = Type.GetType(typeName); Type genericClass = typeof(Generic<>); // Note the <> here Type constructedClass = genericClass.MakeGenericType(typeArgument); object created = Activator.CreateInstance(constructedClass); } }</code>
にType.MakeGenericType()
を置き換えます。 Generic<T>
その後、この新しく構築されたタイプをインスタンス化します。 オープンジェネリックタイプを指定するためにT
の使用に注意してください。
以上がジェネリッククラスは、ランタイム決定されたタイプパラメーターでインスタンス化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。