【问题标题】:Getting a delegate from an interface method从接口方法获取委托
【发布时间】: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 对此感到疑惑并已修复,但这不是问题:-)

标签: c# interface delegates


【解决方案1】:

无论如何,我将商店实现为 IDictionary,然后从 Action 中创建一个 IHandles ..

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多