我有以下课程:
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 关键字传递的参数。尝试将源参数添加到列表或将其分配给字段变量不允许它保留对实际委托的原始引用的引用;所以我的问题是:
- 有没有办法取消订阅所有来源而不再次传递它们的引用?
- 如果不是,如何更改类以支持它,但仍然通过方法传递委托来维护订阅?
- 不使用反射是否可以实现它?
- 是否可以在不将委托/事件包装在一个类中然后将该类作为订阅参数传递的情况下实现它?
谢谢你。
编辑:似乎不使用包装器或反射,没有解决给定问题的方法。我的目的是使该类尽可能可移植,而不必将委托包装在辅助类中。感谢大家的贡献。