Это достаточно просто, но есть несколько подводных камней. Если вы храните ссылку на исходные объекты, как предлагалось в большинстве примеров, объект не будет собирать мусор . Лучший способ избежать этого - использовать WeakReference, который позволит GC работать правильно.
Итак, все, что вам нужно сделать, это:
1) Добавить список источников в класс:
private readonly List<WeakReference> _sources = new List<WeakReference>();
2) Добавить источник в список:
public void Subscribe(ref Action<string> source)
{
source += Broadcast;
//Store the reference
_sources.Add(new WeakReference(source));
}
3) А затем просто примените утилиту:
public void Dispose()
{
foreach (var r in _sources)
{
var source = (Action<string>) r.Target;
if (source != null)
{
source -= Broadcast;
source = null;
}
}
_sources.Clear();
}
Тем не менее, есть также вопрос о том, почему Действие должно быть принято в качестве ссылки. В текущем коде нет причин для этого. Во всяком случае, это не влияет на проблему или решение.