1. ホーム
  2. c#

[解決済み] C#のジェネリックス、変数の型をパラメータとして使用する [重複]...

2022-06-18 10:58:29

質問

ジェネリックメソッドを

bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;

のように使うにはどうしたらよいでしょうか。

Type t = entity.GetType();
DoesEntityExist<t>(entityGuid, transaction);

以下のようなコンパイルエラーが発生します。

型名または名前空間名 't' が見つかりません。 が見つかりません(usingディレクティブやアセンブリの参照がないのでしょうか? ディレクティブかアセンブリ参照が足りないのでしょうか?)

DoesEntityExist<MyType>(entityGuid, transaction);

は完全に動作しますが、毎回別の型名でメソッドを呼び出すためにifディレクティブを使用したくありません。

どのように解決するのですか?

ジェネリックのポイントは コンパイル時 型安全性 - つまり、型はコンパイル時に知る必要があるということです。

あなたは は、実行時にしか分からない型で汎用メソッドを呼び出すことができますが、リフレクションを使わなければなりません。

// For non-public methods, you'll need to specify binding flags too
MethodInfo method = GetType().GetMethod("DoesEntityExist")
                             .MakeGenericMethod(new Type[] { t });
method.Invoke(this, new object[] { entityGuid, transaction });

イク。

を作ることができますか? 呼び出し メソッドをジェネリックにして、型の引数として型パラメータを渡し、決定を一段階上のスタックに押し上げることはできますか?

あなたがやっていることについてより多くの情報を与えてくれるなら、それは助けになるでしょう。時には、上記のようにリフレクションを使用する必要があるかもしれませんが、それを行うための正しいポイントを選択すれば、一度だけそれを行う必要があることを確認し、そのポイントより下のすべてのものに通常の方法で型パラメータを使用させることができます。