【发布时间】:2012-12-04 03:38:53
【问题描述】:
我有一些代码基本上抓取了一个事件处理程序,该处理程序处理多个事件,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")
);
}
}
现在第一部分有效,但我不确定创建代表部分是否有效,以及它是否是最好的方法。是否可以创建一个动作?
让 Subscribe 来存储 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); });
}
【问题讨论】:
-
我确定您不是指
t.GetType().GetHashCode()。t已经是Type类型,因此您的密钥始终是 37489757。只需使用t作为密钥。 -
ty 对此感到疑惑并已修复,但这不是问题:-)