1. ホーム
  2. c#

[解決済み] C#でSystem.TypeをGenericパラメータとして使用する

2022-12-27 02:01:19

質問

データベースで照会する必要のある型(System.Type)のリストを持っています。

このタイプのそれぞれについて、次の拡張メソッドを呼び出す必要があります (これはLinqToNhibernateの一部です)。

Session.Linq<MyType>()

しかし、私はMyTypeを持っておらず、代わりにTypeを使いたいのです。

私が持っているのは

System.Type typeOne;

しかし、以下のように実行することができません。

Session.Linq<typeOne>()

GenericパラメータとしてTypeを使用するにはどうしたらよいですか?

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

直接は無理です。ジェネリックのポイントは コンパイル時 型安全性、つまりコンパイル時に興味のある型を知り、その型のインスタンスで作業することができるようにすることです。この場合、あなたが知っているのは Type だけしか知らないので、あなたが持っているオブジェクトがその型のインスタンスであることをコンパイル時にチェックすることができません。

あなたはリフレクションを通してメソッドを呼び出す必要があります - このようなものです。

// Get the generic type definition
MethodInfo method = typeof(Session).GetMethod("Linq", 
                                BindingFlags.Public | BindingFlags.Static);

// Build a method with the specific type argument you're interested in
method = method.MakeGenericMethod(typeOne);
// The "null" is because it's a static method
method.Invoke(null, arguments);

この型を頻繁に使う必要がある場合は、必要な他のジェネリックメソッドを呼び出す独自のジェネリックメソッドを書き、そのメソッドから を呼び出します。 メソッドをリフレクションで呼び出します。