У меня есть «прокси» объект, который должен предоставлять несколько событий, на которые можно подписаться и отписаться. Я называю это прокси-объектом, так как он содержит коммуникационный модуль, который требует от своих пользователей вызова 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 #) и не преобразовывать его в вызовы функций для отмены / подписки;