gpt4 book ai didi

c# - 取消订阅通过 ref 关键字传递给订阅方法的委托(delegate)?

转载 作者:太空狗 更新时间:2023-10-29 17:59:40 26 4
gpt4 key购买 nike

我有以下类(class):

public class Terminal : IDisposable
{
readonly List<IListener> _listeners;

public Terminal(IEnumerable<IListener> listeners)
{
_listeners = new List<IListener>(listeners);
}

public void Subscribe(ref Action<string> source)
{
source += Broadcast;
//Store the reference somehow?
}

void Broadcast(string message)
{
foreach (var listener in _listeners) listener.Listen(message);
}

public void Dispose()
{
//Unsubscribe from all the stored sources?
}
}

我搜索了一段时间,似乎无法存储使用 ref 关键字传递的参数。尝试将源参数添加到列表或将其分配给字段变量不允许它保留对实际委托(delegate)的原始引用的引用;所以我的问题是:

  • 有没有办法取消订阅所有来源而无需再次传递他们的引用资料?
  • 如果不是,如何更改类以支持它,但仍通过方法传递委托(delegate)来维护订阅?
  • 不使用反射是否可以实现?
  • 是否可以在不将委托(delegate)/事件包装在类中然后将类作为订阅参数传递的情况下实现它?

谢谢。

编辑:看来如果不使用包装器或反射,就无法解决给定的问题。我的意图是使该类尽可能具有可移植性,而不必将委托(delegate)包装在辅助类中。感谢大家的贡献。

最佳答案

编辑:好的,那是个坏主意,所以回到基础:

我建议在 Action 上创建一个包装器类:

class ActionWrapper
{
public Action<string> Action;
}

并重构您的初始类以使用包装器:

private ActionWrapper localSource;

public void Subscribe(ActionWrapper source)
{
source.Action += Broadcast;
localSource = source;
}

public void Dispose()
{
localSource.Action -= Broadcast;
}

现在你应该得到想要的结果。

关于c# - 取消订阅通过 ref 关键字传递给订阅方法的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510849/

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