传递代理作为方法参数
我目前正在开发一个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 我不能从方法中返回委托,因为我也需要一些验证。 你有什么想法如何做到这一点?
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是一个字段...属性不能作为参考参数传递 – 2010-10-14 23:41:47
您好, ref关键字在这里不起作用,因为myObject.SomeEventDelegate只是一个包装属性,使事件委托可以在其类外部访问。 – 2010-10-14 23:43:45
@托马斯:啊,好点。我已经忘记了这一点。在这种情况下,可以使用中间变量。编辑... – Cameron 2010-10-14 23:54:52
您可以使用+ = – Andrey 2010-10-14 23:26:12
C#的活动为你生成一个隐藏的代理相结合的代表。要访问此事件,请参阅:http://stackoverflow.com/questions/1129517/c-how-to-find-if-an-event-is-hooked-up/1129530#1129530。 – 2010-10-14 23:54:03
http://izlooite.blogspot.com/2011/02/delegates-vs-methods.html – 2011-02-22 05:00:39