将委托作为方法参数传递

时间:2010-10-14 23:22:45

标签: c# events parameters delegates

我目前正在开发一个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 而且我无法从方法中返回Delegate,因为我也需要进行一些验证。 你对如何做到了吗?

1 个答案:

答案 0 :(得分:5)

使用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;