取消订阅通过ref关键字传递给委托方法的委托?

use*_*567 9 c# parameters delegates ref unsubscribe

我有以下课程:

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 有没有办法取消订阅所有来源而不再传递他们的参考?
  • 如果没有,为了支持它,如何更改类,但仍然通过一个方法传递委托来维护订阅?
  • 是否有可能在不使用Reflection的情况下实现它?
  • 是否有可能在没有将委托/事件包装在类中然后将类作为订阅参数传递的情况下实现它?

谢谢.

编辑:似乎没有使用包装器或反射,没有解决给定的问题.我的目的是使类尽可能地可移植,而不必将代理包装在辅助类中.谢谢大家的贡献.

Tud*_*dor 2

编辑:好吧,这是一个坏主意,所以回到基础知识:

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

class ActionWrapper
{
    public Action<string> Action;
}
Run Code Online (Sandbox Code Playgroud)

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

private ActionWrapper localSource;

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

public void Dispose()
{
    localSource.Action -= Broadcast;
}
Run Code Online (Sandbox Code Playgroud)

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