所以我有一个名为的接口,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)
. 但是,这也行不通,因为我想动态加载、实例化和注册 Workers。
这甚至是正确的方法还是有更好的方法来实现这一点?