我有一些代码基本上抓住了一个处理多个事件的事件处理程序,IHandles处理1个事件的每个句柄方法。
public interface IHandles { }
public interface IHandles<T> : IHandles
{
void Handle(T message);
}
public void SubscribeHandler(IHandles eventHandler)
{
var genericHandler = typeof(IHandles<>);
var supportedEventTypes = eventHandler.GetType()
.GetInterfaces()
.Where(iface => iface.IsGenericType && iface.GetGenericTypeDefinition() == genericHandler)
.Select(iface => iface.GetGenericArguments()[0])
.ToList();
// Register this handler for each of the handled types.
foreach (var eventType in supportedEventTypes)
{
Subscribe(eventType.GetType(),
Delegate.CreateDelegate(eventType, eventHandler, "Handle")
);
}
}
现在第一位有效但我不确定Create Delegate部分是否有效以及它是否是最佳方式。是否可以创建一个Action?
最好让订阅商店IHandles代替Delgate,但很高兴能够只注册一次性操作,尤其是单元测试。
public IDisposable Subscribe(Type t, Delegate delegate1)
{
var key = t;
if (!actions.ContainsKey(key))
actions.Add(key, new List<Delegate>());
actions[key].Add(delegate1);
return new DomainEventRegistrationRemover(delegate { actions[key].Remove(delegate1); });
}
答案 0 :(得分:0)
无论如何,我将实现商店作为IDictionary,然后从Action创建一个IHandles ..