C # шаблон события - PullRequest
       15

C # шаблон события

0 голосов
/ 08 ноября 2018

У меня есть «прокси» объект, который должен предоставлять несколько событий, на которые можно подписаться и отписаться. Я называю это прокси-объектом, так как он содержит коммуникационный модуль, который требует от своих пользователей вызова Subscribe(topic) и Unsubscribe(topic), чтобы он начал публиковать свои события.

Поэтому я хочу, чтобы мои пользователи могли:

void OnSomthingHappened(What what)
{
    //...
}


EventsGuy.SomethingHappened += OnSomthingHappened;

и EventsGuy.cs В настоящее время я делаю:

const string SomethingHappenedTopic = "SomethingHappened";
private event Action<What> m_SomethingHappened;
public event Action<What> SomethingHappened
{
    add
    {
        m_SomethingHappened += value;
        if (m_SomethingHappened.GetInvocationList().Length == 1)
        {
            Subscribe(SomethingHappenedTopic, (topic, body) =>
            {
                What what = Deserialize<What>(body);
                m_SomethingHappened?.Invoke(what);
            });
        }
    }
    remove
    {
        if (m_SomethingHappened.GetInvocationList().Length == 1)
        {
            Unsubscribe(SomethingHappenedTopic);
        }
        m_SomethingHappened -= value;
    }
}

Проблема в том, что у меня есть множество событий, которые нужно раскрыть, и код почти одинаков для всех, с той лишь разницей:

  • Тема
  • Тип параметра события (в приведенном выше примере What)

Я пришел из C ++, и там я бы использовал шаблоны, чтобы решить эту проблему с некоторым отображением между типом и строкой.

В настоящее время я использовал скрипт с этим отображением для генерации кода для каждой темы, и мне интересен способ использования компилятора для этого, но я не совсем уверен, как такое можно сделать с помощью C # , Исходя из моего понимания, Generics не может помочь с этим, и у меня не может быть класса "Base-Delegate", чтобы использовать наследование для этого (могу ли я?).

Обратите внимание, что я хотел бы сохранить интерфейс прокси-сервера таким же (используя события C #) и не преобразовывать его в вызовы функций для отмены / подписки;

...