Отказаться от подписки на делегат, переданный через ключевое слово ref методу подписки?

У меня есть следующий класс:

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, не может быть сохранен . Попытка добавить исходный аргумент в список или назначить его переменной поля не позволяет сохранить ссылку на исходную ссылку фактического делегата; Итак, мои вопросы:

  • Есть ли способ отказаться от подписки на все источники без повторной передачи их ссылок?
  • Если нет, как можно изменить класс, чтобы поддерживать его, но при этом поддерживать подписку, передавая делегировать с помощью метода?
  • Можно ли достичь этого без использования Reflection?
  • Можно ли добиться этого без упаковки делегата / события в класс и последующей передачи класса в качестве параметра для подписки?

]Спасибо.

РЕДАКТИРОВАТЬ: Похоже, что без использования Wrapper или Reflection нет решения данной проблемы. Мое намерение состояло в том, чтобы сделать класс максимально переносимым, без необходимости заключать делегатов во вспомогательные классы. Спасибо всем за вклад.

9
задан svick 31 January 2012 в 00:27
поделиться