Switch auf generische Klasse des Typs generische Klasse

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Switch auf generische Klasse des Typs generische Klasse

    Hallo zusammen,

    vielleicht hat ja Jemand von euch eine Idee.

    Folgende Situation:

    Ich habe ein generisches Objekt des Typs ServerProtokoll<T>. Das kann ich ich ja mithilfe eines Switches direkt casten, wenn es der gewünschte Typ ist.
    Beispiel:

    C#-Quellcode

    1. switch(nachricht)
    2. {
    3. case ServerProtokoll<SendAufgabenNachricht> msg:
    4. OnAufgabenListeReceived(new NachrichtenEventArgs<DataTable>(msg.Nachricht.Aufgaben));
    5. break;
    6. case ServerProtokoll<SearchAufgabenIdNachricht> msg:
    7. OnSearchAufgabenIdsReceived(new NachrichtenEventArgs<DataTable>(msg.Nachricht.Result));
    8. break;
    9. }


    Nun gibt es aber den Fall, dass dieser Typ auch noch einen generischen Wert hat. Beispiel:
    case ServerProtokoll<UniversalNachricht<Aufgabe>> msg:

    Gibt es nun eine einfache Möglichkeit, unabhängig des Typs der zweiten generischen Klasse alle Nachrichten gleich zu behandeln?
    case ServerProtokoll<UniversalNachricht<T>> msg:

    Funktioniert leidert nicht.

    Ich möchte den Wert hier nur speichern und nicht spezifisch verarbeiten.

    Viele Grüße,
    Marvin
    Eine Solution geht nicht, da der Code sehr groß ist. Ich habdas ganze mal so klein wie möglich hier dargestellt:

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. object wert = new GeheimerWert<GeheimerWert2<bool>>(new GeheimerWert2<bool>(true));
    4. switch (wert)
    5. {
    6. case GeheimerWert<string> msg:
    7. Console.WriteLine(msg.Value);
    8. break;
    9. case GeheimerWert<GeheimerWert2<bool>> msg:
    10. Console.WriteLine(msg.GetType());
    11. break;
    12. default:
    13. break;
    14. }
    15. Console.ReadKey();
    16. }
    17. class GeheimerWert<T>
    18. {
    19. public T Value { get; set; }
    20. public GeheimerWert(T value)
    21. {
    22. this.Value = value;
    23. }
    24. }
    25. class GeheimerWert2<T>
    26. {
    27. public T Value { get; set; }
    28. public GeheimerWert2(T value)
    29. {
    30. this.Value = value;
    31. }
    32. }
    @MarvinKleinMusic Ich würde das ganze mit nem If und weiteren Else If machen, das ist funktional identisch, compiliert aber.
    Ggf. musst Du den Type testen:

    C#-Quellcode

    1. if (wert is GeheimerWert<string>)
    2. {
    3. Console.WriteLine(msg.Value);
    4. }
    5. else if (wert is GeheimerWert<GeheimerWert2<bool>>)
    6. {
    7. Console.WriteLine(msg.GetType());
    8. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist ja genauso wie der Switch. Mir geht es nun aber viel mehr darum, dass der Type der Zweiten generischen Klasse unbekannt sein kann.

    Sprich das ich einen Case/if habe
    case GeheimerWert<GeheimerWert2<T>> msg:

    Der nun unabhängig des Datentyps funktioniert.

    MarvinKleinMusic schrieb:

    unbekannt sein kann
    Der sollte dann im default- bzw. else-Zweig auftauchen.
    Was bringt denn wert.GetType() zurück?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich glaube, du meinst Pseudocode-mäßig sowas, oder?:

    C#-Quellcode

    1. if (wert is GeheimerWert<string> ||
    2. wert is GeheimerWert<int> ||
    3. wert is GeheimerWert<bool> ||
    4. wert is GeheimerWert<DateTime> ||
    5. wert is GeheimerWert<Point> ||
    6. wert is GeheimerWert<Exception> ||
    7. wert is GeheimerWert<GenerellIrgendwasBeliebiges> ||
    8. ....)
    9. {
    10. }

    Also wen wert irgend ein GeheimerWert<T> ist, wobei T beliebig sein kann. Hab ich das richtig verstanden?

    (Bzw. in deinem Fall halt GeheimerWert<GeheimerWert2<T>>, wobei hier T beliebig sein kann.)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils