私は汎用インターフェイスの階層を持っています。すべてのインターフェイスは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つのインスタンスを保持します。 私はリフレクションを使用してオブジェクトをナビゲートし、使用する汎用タイプを確認します。
最初の質問:ここで
は、あなたが選択を行うことができる方法です。 –
これは、ファクトリの静的コンストラクタで実行されます。理由は、存在するすべての演算子を知りたいからです。遅延ローディングアプローチを実装するにはどうすればよいですか? – AFusco
必要なときにタイプをインスタンス化し、必要に応じて静的プロパティでキャッシュすることもできます。 –