2016-03-27 2 views
0

Ich habe eine Art Beobachter-Muster in C# Implementierung geht das wie folgt aus:Gibt es eine Möglichkeit, Deklarationen mit Generics in C# zu erstellen?

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; 
    } 
} 

dieser Klasse verwenden wir folgendes haben:

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

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

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

ich in Völker Kommentare Interesse hätte ob es Verbesserungen/bessere Möglichkeiten gibt, dieses Muster zu implementieren/verfügbar zu machen, meine Hauptfrage ist jedoch, ob es einen Weg gibt, all diese Deklarationen auf generische Weise zu machen, äquivalent zu einem Makro, das ich in C++ erstellt habe.

Es gibt eine Menge Code bei der Erklärung dieser, die vollständig generisch ist, vor allem die Benennung.

In C++, ich könnte ein Makro verwenden, um die Delegierten und die Schnittstelle, so etwas wie zu erklären:

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

Es ist klar, dass dies verbirgt sich eine Menge von dem, was vor sich geht, aber es schneller Implementierung erlaubt, Fehler reduziert und erzwingt Konsistenz.

Gibt es eine gleichwertige Möglichkeit, die Implementierung in C# zu vereinfachen?

Dank

Jules

+0

Yup, das beobachtbare Muster ist in C# und exponierte Gedankenereignisse eingebaut. https://msdn.microsoft.com/en-us/library/awbftdfh.aspx Sie müssen nicht wirklich das Ereignis von Grund auf neu implementieren, verwenden Sie einfach das, das die Sprache bietet –

Antwort

2

C# hat keine Codegenerierungsfunktion. Sie können versuchen, ähnliches Verhalten mit Hilfeseitenbibliothek wie eine PostSharp zu realisieren. Und ich rate zur Verwendung für die Realisierung Beobachter-Subscriber-Muster verfügbaren Schnittstellen IObserver <T> und IObservable <T> Ant sah auf Reactive Extensions library.

1

Sie T4 delegiert und Schnittstelle zu generieren automatisch aus einer Liste verwenden können und es automatisch in ähnlicher Weise wie C-Makros auf Build zu generieren.

Verwandte Themen