2017-09-03 6 views
2

私は汎用インターフェイスの階層を持っています。すべてのインターフェイスはIOperator<T1,T2>に関連しています。ジェネリックインターフェイスのインスタンスを実装するすべてのクラスをインスタンス化

interface IOperator<T1, T2> 
{ 
    Func<T1, T2, bool> GetFunc() 
} 

IOperator : IOperator<object, object> 

interface IMatchingOperator : IOperator<string, string> { } 


interface IComparisonOperator<T1, T2> : IOperator<T1, T2> 
    where T1: IComparable<T2> { } 

interface IComparisonOperator<T> : IComparisonOperator<T, T> 
    where T: IComparable<T> { } 

interface IComparisonOperator : IComparisonOperator<IComparable, object> 

私には、例えば、これらのインタフェースの一つ以上を実装するクラス(ジェネリックではない)がたくさんある:

class GreaterThanOperator : 
    IComparisonOperator, 
    IComparisonOperator<decimal>, 
    IComparisonOperator<DateTime>, 
    IComparisonOperator<DateTime, string> 
{ ... } 

class EqualComparator: IOperator 

class RegexOperator : IMatchingOperator { ... } 

を今、私はロードし、インスタンス化できる工場を作成したいですどのようにして親インターフェイス "IOperator"を実装しているアセンブリのすべてのクラスをコレクションに入れます。

私が試した:

AppDomain.CurrentDomain.GetAssemblies() 
       .SelectMany(x => x.GetTypes()) 
       .Where(
        x => x.IsGenericType 
        && x.GetGenericTypeDefinition() == typeof(IOperator<,>) 
        && !x.IsInterface && !x.IsAbstract)) 
       .Select(x => Activator.CreateInstance(x)).ToList(); 

が、それは動作しません。

最後のリストには、それぞれIOperatorクラスの1つのインスタンスを保持します。 私はリフレクションを使用してオブジェクトをナビゲートし、使用する汎用タイプを確認します。

+0

最初の質問:ここで

は、あなたが選択を行うことができる方法です。 –

+0

これは、ファクトリの静的コンストラクタで実行されます。理由は、存在するすべての演算子を知りたいからです。遅延ローディングアプローチを実装するにはどうすればよいですか? – AFusco

+0

必要なときにタイプをインスタンス化し、必要に応じて静的プロパティでキャッシュすることもできます。 –

答えて

2

Where句は、クラスGreaterThanOperatorなどが汎用クラスではないため、ジェネリック型をチェックするべきではありません。さらに、IOperator<,>ではありません。あなたのタイプの定義:それはそれによって実装されたインターフェースのタイプ定義です。あなたは `レイジーloading`技術を探しているように見える、なぜあなたはこれをやろうとしている、

var res = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(x => x.GetTypes()) 
    .Where(x => 
     !x.IsAbstract 
    && !x.IsInterface 
    && x.GetInterfaces().Any(i => 
      i.IsGenericType() 
     && i.GetGenericTypeDefinition() == typeof(IOperator<,>) 
     ) 
    ).Select(x => Activator.CreateInstance(x)).ToList(); 
関連する問題