【问题标题】:Passing delegate as method parameter将委托作为方法参数传递
【发布时间】:2017-05-04 23:35:34
【问题描述】:

我目前正在开发一个 EventManager 类,以确保没有事件被连接到死的 WCF 双工客户端,并且还控制防止从同一个客户端到一个事件的多个连接。

现在基本上,我一直在尝试将事件委托传递给一个函数,该函数将像这样控制分配。

var handler = new SomeEventHandler(MyHandler);
Wire(myObject.SomeEventDelegate, handler);

这样称呼:

private void Wire(Delegate eventDelegate, Delegate handler)
{
    // Pre validate the subscription.
    eventDelegate = Delegate.Combine(eventDelegate, handler);
    // Post actions (storing subscribed event delegates in a list)
}

更新

SomeEventDelegate 包装器的代码是:

public Delegate SomeEventDelegate
{
    get { return SomeEvent; }
    set { SomeEvent = (SomeEventHandler) value; }
}

event SomeEventHandler SomeEvent;

显然委托没有返回给 myObject.SomeEventDelegate 而且我无法从该方法返回委托,因为我也需要一些验证。 您对如何执行此操作有任何想法吗?

【问题讨论】:

标签: c# events parameters delegates


【解决方案1】:

使用C# ref parameter modifier

var handler = new SomeEventHandler(MyHandler);
Wire(ref myObject.SomeEventDelegate, handler);

private void Wire(ref Delegate eventDelegate, Delegate handler)
{
    // Pre validate the subscription.
    eventDelegate = Delegate.Combine(eventDelegate, handler);
    // Post actions (storing subscribed event handlers in a list)
}

还要注意,有一些很好的语法糖(从 C# 2.0 开始)用于分配和组合委托(例如,参见 this article):

Wire(ref myObject.SomeEventDelegate, MyHandler);

private void Wire(ref Delegate eventDelegate, Delegate handler)
{
    // Pre validate the subscription.
    eventDelegate += handler;
    // Post actions (storing subscribed event handlers in a list)
}

有人向我指出ref 仅适用于字段,而不适用于属性。在属性的情况下,可以使用中间变量:

var tempDelegate = myObject.SomeEventDelegate;
Wire(ref tempDelegate, MyHandler);
myObject.SomeEventDelegate = tempDelegate;

【讨论】:

  • 请注意,它仅在 SomeeventDelegate 是一个字段时才有效...属性不能作为 ref 参数传递
  • 您好,ref 关键字在这里不起作用,因为 myObject.SomeEventDelegate 只是一个包装属性,使事件委托可以在其类之外访问。
  • @Thomas:啊,好点子。我已经忘记了。在这种情况下,可以使用中间变量。正在编辑...
  • 好的,我相信它现在可以工作了!我按照 Steve Guidi 的建议更改了事件声明,并且可以使用 ref 关键字。谢谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2016-02-06
  • 1970-01-01
  • 2023-03-05
  • 2013-11-17
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多