2017-01-02 3 views
6

私のプロジェクトでは、次のクラスを使用します:Filter<T>.Checker<U>にはインタフェースICheckerもあります。それは次のようになります。C#の汎用クラスのネストされた汎用クラスの型を取得します

class Filter<T> { 

    public interface IChecker { 
     ... 
    } 

    public class Checker<U> : IChecker { 
     ... 
    } 

    List<IChecker> checkers; 

    ... 

} 

Filterクラスは、フィルタがUが

T.でこのフィールドのタイプであるクラスTで異なるフィールドをチェックするためにiCheckerリストを使用するタイプTのオブジェクトをフィルタリング

別のクラスの他のメソッドでは、チェッカーのインスタンスを作成したいと考えています。このメソッドでは、Tの型はTransactionです。これはコンパイル時に認識されます。 Uの型は、Typeインスタンスによってのみ認識されます。以下のコードは、通常、型を知っているジェネリッククラスのインスタンスを作成する方法を示しています。

Type type = typeof(MyObject<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

私は少しさらにこれをしたいと次の手順を実行します

Type type = typeof(Filter<Transaction>.Checker<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

一部typeof(Filter<Transaction>.Checker<>)がコンパイルされません。コンパイラはUnexpected use of an unbounded generic nameと言っています。

C#のGenericクラスにネストされたGenericクラスの型を取得することは可能ですか?

+2

に追加するには、すでに答えを掲載 - それは[MSDN](HTTPS上の文書で説明しています: //msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx)。 **ネストされた型**セクション、特に:* "ネスト型のジェネリック型定義からジェネリック型を構築するには、すべての囲み型の型引数配列を連結した配列でMakeGenericTypeメソッドを呼び出し、一番外側のジェネリック型から始まり、ネストされた型自体の型引数配列で終わる場合、 – MarcinJuraszek

答えて

3

よくジェネリックスを使用するには、一般的な引数をすべて指定する必要があります。あなたはコンパイル時に型のTransactionを知っていますが、あなたはtypeof()経由で指定する必要が

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction), objectType); 
object myObject = Activator.CreateInstance(type); 

、しかし:あなたはコンパイル時に第二引数を知らない、あなたはMakeGenericTypeの引数としてそれらの両方に合格しなければならないので、それは傷ついてはいけません。

私はisオペレータを介して、タイプ引数が予想された順序で適用されることを確認しました。私はあなたがここで最初のジェネリックパラメータTを省略し、配列として両方のタイプを渡すために持っていると思う

4

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction),objectType); 
関連する問題