Autor Beitrag
Määx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: Fr 09.08.13 11:50 
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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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:

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

Für diesen Beitrag haben gedankt: Määx
Määx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 123



BeitragVerfasst: 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!