ホームページ >バックエンド開発 >C++ >C# で変数の型をジェネリック パラメーターとして使用するにはどうすればよいですか?

C# で変数の型をジェネリック パラメーターとして使用するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-17 20:47:10808ブラウズ

How Can I Use a Variable's Type as a Generic Parameter in C#?

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 サイトの他の関連記事を参照してください。

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