Abstrakte Liste

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von EugenIS.

    Abstrakte Liste

    Hallo Leute und danke für's reinschauen...

    Kann mir einer helfen was aufzurufen: (sieh Kommentare)

    C#-Quellcode

    1. private void RefreshMe(DataTable data)
    2. {
    3. try
    4. {
    5. if (data == null)
    6. MessageBox.Show("Bei der Datanbank ist der Broker deaktiviert!", jcStatic.faName, MessageBoxButton.OK, MessageBoxImage.Error);
    7. for (int i = 0; i < data.Rows.Count; i++)
    8. {
    9. foreach (DataColumn c in data.Rows[i].Table.Columns)
    10. {
    11. var xx = CreateItemFromRow<jcError>(data.Rows[i]);//Das hier geht. Ich kenne an der Stelle den Typ noch nicht. War nur zum testen...
    12. var xx1 = CreateItemFromRow<T>(data.Rows[i]);//Wie ruf ich dem Kram hier auf??? An sich muss es so sein...
    13. }
    14. }
    15. }
    16. catch (Exception ex)
    17. {
    18. jcStatic.ShowError(ex);
    19. }
    20. }
    21. private TT CreateItemFromRow<TT>(DataRow row) where TT : new()
    22. {
    23. TT item = new TT();
    24. SetItemFromRow(item, row);
    25. return item;
    26. }
    27. private void SetItemFromRow<TT>(TT item, DataRow row) where TT : new()
    28. {
    29. foreach (DataColumn c in row.Table.Columns)
    30. {
    31. var p = item.GetType().GetProperty(c.ColumnName);
    32. if (p != null)
    33. if (row[c] != DBNull.Value)
    34. p.SetValue(item, row[c], null);
    35. }
    36. }


    ?( ?( ?(
    Wenn Du den Typ selber nicht kennst, wird's schwierig. Das kann ich allerdings nicht nachvollziehen. Ich versteh den Code so: Du hast in einer DataTable die Properties eines bestimmten Typs gespeichert. Somit musst Du ihn ja beim Speichern kennen bzw. angeben. Zu einem späteren Zeitpunkt willst Du eine Instanz jenes Typen erstellen und die gespeicherten Daten in die neue Instanz reinpumpen, indem Du den o.g. Code ausführst. Den Typ könntest Du ja mit abspeichern und dann so (AFAIK) mit Reflection eine Instanz davon erstellen; hast dann aber wohl das Problem, dass Du es untypisierst wiederbekommst, also als object. Aber wenn Du es typisiert brauchst, müsstest Du RefreshMe mit Typparameter ausstatten. Denn stell Dir vor, dass 2 Klassen in einer Assembly die gleichen Properties haben und dann wird Deine Prozedur aufgerufen. Wer soll da entscheiden, von welcher Klasse da eine Instanz erstellt werden soll?
    Summa summarum: Ohne eigene Typangabe beim RefreshMe-Aufruf geht es m.E. nicht typisiert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, du hast vieles richtig erkannt. An sich ist es eine abstrakte Liste: jcEventList<T> : jcSimplyList<T>

    Irgend wann erstelle ich die Liste und vergebe einen Typ. Das was ich da gezeigt habe ist ein Event, der von der Datenbank kommt und soll bei einer Änderung der Datenbank die Liste selbstständig aktualisieren. Soll allgemein gültig sein. Daher verwende ich als Platzhalter T...
    @EugenIS Mit where T kannst Du T ja auch eine Reihe erforderlicxher Methoden und/oder Interfaces aufdrücken.
    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!
    Es klang mir nach: RefreshMe ist ein EventHandler, der von der DB aufgerufen wird. Da die DB nicht weiß, welcher Typ übergeben werden muss bzw- dazu überhaupt nicht in der Lage sein kann, kann eine T-Typeinschränkung nicht angewendet werden. Trotzdem soll eine typisierte Instanz erstellt werden. Das scheint mir daher erstmal nicht machbar.
    Vielleicht könnte man der DB, die ja den EventHandler bzw dessen Adresse kennen muss, ja an eine Klassenprozedur weiterleiten, bei der die entsprechende Klasse typisiert ist. Aber außerhalb einer "typisierten Umgebung" erscheint mir das nicht möglich zu sein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.