传递代理作为方法参数

问题描述:

我目前正在开发一个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 我不能从方法中返回委托,因为我也需要一些验证。 你有什么想法如何做到这一点?

+0

您可以使用+ = – Andrey 2010-10-14 23:26:12

+1

C#的活动为你生成一个隐藏的代理相结合的代表。要访问此事件,请参阅:http://stackoverflow.com/questions/1129517/c-how-to-find-if-an-event-is-hooked-up/1129530#1129530。 – 2010-10-14 23:54:03

+0

http://izlooite.blogspot.com/2011/02/delegates-vs-methods.html – 2011-02-22 05:00:39

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

请注意,它只会工作,如果SomeeventDelegate是一个字段...属性不能作为参考参数传递 – 2010-10-14 23:41:47

+0

您好, ref关键字在这里不起作用,因为myObject.SomeEventDelegate只是一个包装属性,使事件委托可以在其类外部访问。 – 2010-10-14 23:43:45

+0

@托马斯:啊,好点。我已经忘记了这一点。在这种情况下,可以使用中间变量。编辑... – Cameron 2010-10-14 23:54:52