gpt4 book ai didi

c# - 将委托(delegate)作为方法参数传递

转载 作者:太空狗 更新时间:2023-10-29 21:42:00 25 4
gpt4 key购买 nike

我目前正在开发一个 EventManager 类,以确保没有事件连接到死 WCF 双工客户端,并控制防止从同一客户端多次连接到一个事件。

现在基本上,我坚持的是尝试将事件委托(delegate)传递给一个函数,该函数将像这样控制分配。

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;

显然委托(delegate)没有返回到 myObject.SomeEventDelegate而且我不能从方法中返回委托(delegate),因为之后我也需要一些验证。您知道如何执行此操作吗?

最佳答案

使用 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)
}

另请注意,存在一些用于分配和组合委托(delegate)的不错的语法糖(从 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;

关于c# - 将委托(delegate)作为方法参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com