У меня есть следующий класс:
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, не может быть сохранен . Попытка добавить исходный аргумент в список или назначить его переменной поля не позволяет сохранить ссылку на исходную ссылку фактического делегата; Итак, мои вопросы:
]Спасибо.
РЕДАКТИРОВАТЬ: Похоже, что без использования Wrapper или Reflection нет решения данной проблемы. Мое намерение состояло в том, чтобы сделать класс максимально переносимым, без необходимости заключать делегатов во вспомогательные классы. Спасибо всем за вклад.