2012-09-18 7 views
5

W aplikacji .NET, normalnie zdarzenia są podłączone w ten sposób:Jak konwertować EventArgs podczas zdarzeń okablowania?

public event EventHandler<ChangeEventArgs> OnChange 
    { 
     add { _dependency.OnChange += value; } 
     remove { _dependency.OnChange -= value; } 
    } 

Jednak to działa tylko jeśli są okablowane wydarzenia mają taką samą procedurę obsługi zdarzenia. W moim obecnym przypadku oryginalna argumentacja zdarzenia jest własnością biblioteki i nie chcę tego ujawnić kodowi klienta. Więc mam jakiś adapter (ChangeEventArgs). Jak mogę użyć powyższego kodu do konwersji arg wydarzeń? Wyobrażam sobie, coś jak poniżej (ale poniżej kod nie działa)

public event EventHandler<ChangeEventArgs> OnChange 
    { 
     add { _dependency.OnChange += Convert(value); } 
     remove { _dependency.OnChange -= Convert(value); } 
    } 

lub

public event EventHandler<ChangeEventArgs> OnChange 
    { 
     add { _dependency.OnChange += value(this, Convert(args)); } 
     remove { _dependency.OnChange -= value(this, Convert(args)); } 
    } 
+2

Gdybym nie rozumieją pytanie można napisać otoki dla zdarzenia, które wyzwala zdarzenie analizuje zwrócone zdarzenia i zwraca je do biblioteki wywołującej. – Gabber

Odpowiedz

3

Spróbuj tego:

public class SomeClassAdapter 
{ 
    private readonly SomeClass obj; 

    public SomeClassAdapter(SomeClass obj) 
    { 
     this.obj = obj; 
     this.obj.SomeEvent += HandleSomeClassSomeEvent; 
    } 

    private void HandleSomeClassSomeEvent(object sender, SomeEventArgs args) 
    { 
     OnSomeEvent(ConvertEventArgs(args)); 
    } 

    private MyEventArgs ConvertEventArgs(SomeEventArgs args) 
    { 
     // the magic goes here... 
    } 

    protected virtual void OnSomeEvent(MyEventArgs args) 
    { 
     var handler = SomeEvent; 
     if (handler != null) 
     { 
      handler(this, args); 
     } 
    } 

    public event EventHandler<MyEventArgs> SomeEvent; 
} 

Update.
Ten kod używa bardziej złożonej wersji wzorca adaptera niż twój kod. SomeClassAdapter to adapter dla SomeClass (ma on instancję SomeClass w swoim prywatnym polu obj).

Kod klienta subskrybuje mySomeClassAdapter.SomeEvent. Mój kod z kolei subskrybuje SomeClass.SomeEvent. Po uruchomieniu SomeClass.SomeEvent wywoływana jest moja funkcja obsługi zdarzeń (HandleSomeClassSomeEvent). Ten program obsługi zdarzeń konwertuje SomeEventArgs na MyEventArgs i podnosi SomeClassAdapter.SomeEvent.

Mamy więc łańcuch: SomeClass.SomeEvent ->HandleSomeClassSomeEvent ->SomeClassAdapter.SomeEvent. Wygląda na "proxy zdarzenia".

+0

Czy możesz wyjaśnić, jak to działa? –

+0

@LouisRhys: Aktualizuję odpowiedź. Mam nadzieję że to pomoże. – Dennis

0

Istnieje kilka rzeczy trzeba zrobić tutaj, bym ja zamierzam zakładać typ zwracanej metodę Convert() będzie nazywany SupportedChangeEventArgs

normalny wzorzec będzie wówczas mieć:

public event EventHandler<SupportedChangeEventArgs> Changed; // per http://msdn.microsoft.com/en-us/library/h0eyck3s%28v=vs.71%29.aspx 

dodawania posiada człon wirtualny, który zgłasza zdarzenie

public virtual void OnChanged(ChangeEventArgs e) 
{ 
    if(Changed != null) 
    { 
     Changed(this, Convert(e)); 
    } 
} 
Powiązane problemy