C# で変数型をジェネリック パラメーターとして使用する
C# のジェネリックスはコンパイル時の型安全性を提供し、コンパイル時に型がわかっている必要があります。
ジェネリックメソッドを定義するとします:
<code class="language-csharp">bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;</code>
これを動的に使用しようとすると、コンパイル エラーが発生します:
<code class="language-csharp">Type t = entity.GetType(); DoesEntityExist<t>(entityGuid, transaction);</code>
これは、t
は実行時にのみ認識され、ジェネリックスのコンパイル時の型安全性の原則に違反するためです。
リフレクションを使用して、動的に型指定されたジェネリック メソッドを処理できます。
<code class="language-csharp">MethodInfo method = GetType().GetMethod("DoesEntityExist") .MakeGenericMethod(new Type[] { t }); method.Invoke(this, new object[] { entityGuid, transaction });</code>
ただし、このアプローチは、複雑さとパフォーマンスのオーバーヘッドのため、理想的ではありません。
より良い解決策は、呼び出しメソッドをジェネリックにして、型パラメーターを型パラメーターとして渡すことです。
<code class="language-csharp">void MyMethod<T>(T entity, Guid guid, ITransaction transaction) { DoesEntityExist<T>(guid, transaction); }</code>
これにより、MyMethod
を呼び出すときに型を動的に指定でき、型の安全性を維持しながらリフレクションの使用を回避できます。
以上がC# で変数の型をジェネリック パラメーターとして使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。