だから私は、、そして他の多くのクラスで実装されていると呼ばれるインターフェースを持っていますIWorkItem
。WorkA
WorkB
public interface IWorker<T> where T : IWorkItem
{
void Process(T item);
}
IWorker<T>
インターフェイスはWorkerA
(IWorker<WorkA>
)、WorkerB
(IWorker<WorkB>
)および他の多くのクラスに実装されています。
public static void ProcessWorkItem(IWorkItem item)
{
(/* find the right worker */).Process(item);
}
今私の問題は:与えられたものを処理できるワーカーオブジェクトをどのように見つけるのIWorkItem
ですか?
私の最初の試みは次のように見えますが、ジェネリック型の引数には問題があります。
public static class WorkerRepository
{
private static Dictionary<Type, IWorker<???>> RegisteredWorkers =
new Dictionary<Type, IWorker<???>>();
public static void RegisterWorker(IWorker<???> worker)
{
var handled = from iface in worker.GetType().GetInterfaces()
where iface.IsGenericType
where iface.GetGenericTypeDefinition() == typeof(IWorker<>)
select iface.GetGenericArguments()[0];
foreach (var type in handled)
if (!RegisteredWorkers.ContainsKey(type))
RegisteredWorkers[type] = worker;
}
public static void ProcessWorkItem(IWorkItem item)
{
RegisteredWorkers[item.getType()].Process(item);
}
}
だから私はDictionary
労働者を含むを持っています。ここではどの型の引数が必要ですか?Javaでは使用できます? extends IWorkItem
が、C#でも使用できますか?次にありますRegisterWorker
。おそらく、メソッド全体のジェネリック型引数を提案するでしょうRegisterWorker<T>(IWorker<T> worker)
。ただし、ワーカーを動的にロード、インスタンス化、および登録したいので、これも機能しません。
これは正しいアプローチでさえありますか、それともこれを達成するためのより良い方法がありますか?