このC#コードスニペットは、コンパイラによって直接サポートされていないタスクであるジェネリックのタイプパラメーターとしてインスタンス化された型を使用して検討します。 この記事では、一般的な型パラメーターとして
変数を直接(Type
など)使用しようとすると、コンパイラエラーが発生することを正しく指摘しています。
myType
ソリューションは、レバレッジリフレクションの
メソッドは、この新しく作成されたタイプのオブジェクトをインスタンス化します。
MakeGenericType
説明は、直接的な(および失敗)アプローチと反射ベースのソリューションの違いを明確に示しています。 複数のタイプパラメーターのセクションは、Activator.CreateInstance
。
記事を改善するには、次のことを検討してください
MakeGenericType
エラー処理:
メソッドは、タイプが見つからない場合は
を返すことができます。 nullチェックを追加すると、コードがより堅牢になります。Type.GetType
パフォーマンスの考慮事項:null
読者がトレードオフを理解するためには、直接的な一般的なインスタンス化よりも一般的に反射が遅くなることに言及することです。 このアプローチは、コンパイル時にタイプが不明なシナリオ用に予約する必要があります。
ここで、
は次のように定義されています
エラーメッセージは、通常、「タイプまたは名前空間「mytype」が見つかりませんでした。」です。これは、汎用型パラメーターがコンパイル時に既知のものでなければならないためです。反射ベースのソリューション:動的な汎用インスタンス
反射は、
<code class="language-csharp">string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!</code>
を使用して回避策を提供します。 このアプローチにより、実行時に決定されたタイプで一般的なインスタンスを作成できます。
<code class="language-csharp">string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!</code>
を使用して、特定の汎用タイプ(この場合はType.GetType
)を作成し、インスタンスを作成します。コンソール出力は、インスタンス化の成功を確認します
MakeGenericType
Generic<string>
複数のタイプパラメーターの処理Activator.CreateInstance
複数のタイプパラメーターを持つ汎用クラスの場合、型引数をコンマ分離リストとしてに提供するだけです。
重要な考慮事項:MakeGenericType
<code class="language-csharp">public class MyGenericClass<T> { }</code>
パフォーマンス:反射は、直接的な汎用インスタンスよりも大幅に遅くなります。このアプローチを使用して、コンパイル時にタイプが不明な場合にのみ使用します。
以上がc#ジェネリックのタイプパラメーターとしてインスタンス化されたタイプを渡すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。