我目前正在开发一个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,因为我也需要进行一些验证。 你对如何做到了吗?
答案 0 :(得分:5)
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;