2012-12-04 51 views
2

我有一些基本上抓住事件的代码,处理多个事件的Handler每个处理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") 
       ); 
    } 
} 

现在的第一个工作,但我不知道是否创建委托部分将工作,如果它是最好的方式。是否有可能创建一个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

我敢肯定你不是那个意思't.GetType()。GetHashCode的()'。 't'已经是'Type'类型,因此你的密钥总是37489757.只需使用't'作为密钥。 –

+0

ty想知道那个和修复,但那不是问题:-) – user1496062

回答

0

反正我去实现存储中的IDictionary,然后从操作创建一个IHandles ..