Entwickler-Ecke

Basistechnologien - generische Events


Määx - Fr 09.08.13 11:50
Titel: generische Events
Hallo zusammen,

ich arbeite in meinem neuen Projekt sehr viel mit Events und wollte nun eine in meiner Klasse liegende generische Funktion auslagern. Bisher sieht diese so aus:

C#-Quelltext
1:
2:
3:
4:
5:
private void sendMessage<T>(T myObject)
{
  string xml = Common.serializeObjectToXML<T>(myObject));
  [...]
}


Nun wollte ich diese Funktion gerne an eine "übergeordnete" Klasse übergeben:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public delegate void SendMessageEventHandler<T>(MyClass theClass, T myObject);
public event SendMessageEventHandler<T> sendMessage;
private void sendMessage<T>(T myObject)
{
  if(sendMessage!=null)
    sendMessage(myObject);
}


Leider kann ich dem public event keinen generischen Typ übergeben? Gibt es eine Möglichkeit dies doch irgendwie zu realisieren oder muss ich für jeden möglichen Typ ein eigenes Event definieren??

Vielen Dank
Määx


Ralf Jansen - Fr 09.08.13 12:12

Events sollten eh immer einen EventArgs Abkömmling als Parameter haben und nicht einfach platt irgendein Object. Also immer der Signatur "Sender, EventArgs" folgen. Die EventArgs selber können dann problemlos einen generischen Parameter haben ala EventArgs<T> haben.

Beispiel:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public class EventArgs<T> : EventArgs
{
    public EventArgs(T data) { Data = data; }

    public T Data { get; private set; }        
}

public class Test<T> 
{
    public event EventHandler<EventArgs<T>> MeinLieberEvent;

    protected void RaiseMeinLieberEvent(T x)
    {
        EventHandler<EventArgs<T>> handler = MeinLieberEvent;
        if (handler != null)
            handler(thisnew EventArgs<T>(x));
    }    
}


Määx - Fr 09.08.13 13:21

ah ok danke! Dann werde ich mir das so umbasteln und nach und nach alle anderen Events ebenfalls ersetzen. Ist dann ja auch viel einfacher zu integrieren wenn man zusätzliche Informationen übergeben möchte!
Dank!