2016-03-27 3 views
0

Я реализует своего рода шаблон наблюдателя в C#, который выглядит следующим образом:Есть ли способ создать объявления с использованием дженериков в C#?

public delegate void MyEventOccurred(MyEventArg arg); 
public interface IMyEventOccurred 
{ 
    void OnMyEventOccurred(MyEventArg arg); 
} 

class MyProviderClass 
{ 
    protected MyEventOccurred OnMyEventOccurredHandler; 
    public void AddMyEventOccurredHandler(MyEventOccurred handler) 
    { 
     OnMyEventOccurredHandler -= handler; 
     OnMyEventOccurredHandler += handler; 
    } 

    public void RemoveMyEventOccurredHandler(MyEventOccurred handler) 
    { 
     OnMyEventOcurredHandler -= handler; 
    } 
} 

Чтобы использовать этот класс, мы имеем следующее:

class MyObserverClass : IMyEventOccurred 
{ 
    void OnMyEventOccurred(MyEventArg arg) 
    { 
     // Handle my event 
    } 

    void StartObserving(MyProviderClass provider) 
    { 
     provider.AddMyEventOccurredHandler(OnMyEventOccurred); 
    } 

    void StopObserving(MyProviderClass provider) 
    { 
     provider.RemoveMyEventOccurredHandler(OnMyEventOccurred); 
    } 
} 

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

Существует много кода, объявляющих это полностью общее, особенно именование.

В C++ я мог бы использовать макрос, чтобы объявить делегат и интерфейс, что-то вроде:

#define DECLARE_EVENT(eventName, eventArg) \ 
    public delegate void eventName(eventArg arg); \ 
    public interface I ## eventName \ 
    { \ 
     void On ## eventName(eventArg arg); \ 
    } 

Это ясно, что это скрывает много того, что происходит, но он позволяет быстрее реализации, уменьшает количество ошибок и обеспечивает согласованность.

Есть ли эквивалентный способ упрощения реализации в C#?

Благодаря

Жюль

+0

Yup, Наблюдаемый шаблон встроен в C# и подвергается мысленным событиям. https://msdn.microsoft.com/en-us/library/awbftdfh.aspx вам действительно не нужно реализовывать мероприятие с нуля, просто используйте тот, который предлагает язык –

ответ

2

C# не обладает способ генерации кода. Вы можете попытаться реализовать подобное поведение с помощью библиотеки сайта, например, PostSharp. И я советую использовать для реализации интерфейс наблюдателя-подписчика доступных интерфейсов IObserver <T> и IObservable <T> муравей посмотрел на Reactive Extensions library.

1

Вы можете использовать T4 для создания делегата и интерфейс автоматически из списка и автоматически генерировать его сборки аналогичным образом на макросы C.

Смежные вопросы