2012-12-04 49 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 ..