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); });
}
我敢肯定你不是那個意思't.GetType()。GetHashCode的()'。 't'已經是'Type'類型,因此你的密鑰總是37489757.只需使用't'作爲密鑰。 –
ty想知道那個和修復,但那不是問題:-) – user1496062