C# 将委托作为方法参数传递

C# 将委托作为方法参数传递,c#,events,parameters,delegates,C#,Events,Parameters,Delegates,我目前正在开发一个EventManager类,以确保没有任何事件连接到失效的WCF双工客户端,并控制防止从同一客户端到一个事件的多个连接 现在基本上,我一直在尝试将事件委托传递给一个函数,该函数将像这样控制赋值 var handler = new SomeEventHandler(MyHandler); Wire(myObject.SomeEventDelegate, handler); 称之为: private void Wire(Delegate eventDelegate, Delega

我目前正在开发一个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#2.0开始)(例如,请参见):

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

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

您可以使用+=C#事件组合委托,为您生成隐藏委托。若要访问此事件,请参阅:。请注意,仅当SomeeventDelegate是字段时,它才起作用。。。属性不能作为ref参数传递。在这里,ref关键字不起作用,因为myObject.SomeEventDelegate只是一个包装属性,使事件委托可以在its类之外访问。@Thomas:啊,说得好。我已经忘记了。在这种情况下,可以使用中间变量。编辑…好的,我相信它现在可以工作了!根据SteveGuidi的建议,在我可以使用ref关键字之后,我更改了事件声明。谢谢大家的帮助!
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)
}
var tempDelegate = myObject.SomeEventDelegate;
Wire(ref tempDelegate, MyHandler);
myObject.SomeEventDelegate = tempDelegate;