Typ an eine Methode übergeben / mit GetType auswerten

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von eichseinet.

    Typ an eine Methode übergeben / mit GetType auswerten

    Hallo zusammen.

    Ich würde gerne mehrere XML-Dateien über eine Methode einlesen. Grundsätzlich funktioniert das auch, aber es gibt Probleme in der Zeile mit GetType.

    VB.NET-Quellcode

    1. Public Function XML_lesen(ByVal Datei As String, ByRef Coll As Object)
    2. Dim Seriendings As XmlSerializer
    3. Dim Leser As IO.StreamReader
    4. If My.Computer.FileSystem.FileExists(Datei) = True Then 'wenn die Datei existiert...
    5. Seriendings = New XmlSerializer(GetType(ObservableCollection(Of Tab01_Klasse)))
    6. Leser = New IO.StreamReader(Datei)
    7. For Each item In Seriendings.Deserialize(Leser)
    8. Coll.Add(item)
    9. Next
    10. Leser.Dispose() 'XML-Datei wieder freigeben!
    11. End If
    12. Return Nothing
    13. End Function


    Wie lässt sich "ObservableCollection(Of Tab01_Klasse)" als Parameter übergeben? Der Typ ist bei jeder Collection ein anderer. Mein Versuch hier gleich die gesendete Collection einzufügen mochte GetType nicht; es existiert kein Typ "meine Collection".

    GRuß

    eddi
    jaja - ich hab die Lösung schon fertig.
    Löse du deine Compile-Fehler - wie gesagt: bevor du weiter-codest.

    ach - egal - ich habs ja nicht zu sagen - zwei Varianten:

    VB.NET-Quellcode

    1. Public Sub XML_lesen(Of T)(Datei As String, Coll As ObservableCollection(Of T))
    2. If Not System.IO.File.Exists(Datei) Then Return
    3. Dim Seriendings = New XmlSerializer(GetType(List(Of T)))
    4. Using Leser = New IO.StreamReader(Datei)
    5. For Each item In DirectCast(Seriendings.Deserialize(Leser), List(Of T))
    6. Coll.Add(item)
    7. Next
    8. End Using
    9. End Sub
    10. Public Function XML_lesen(Of T)(Datei As String) As ObservableCollection(Of T)
    11. Return New FileInfo(Datei).DeserializeXml(Of ObservableCollection(Of T))
    12. End Function
    und werd glücklich damit.

    Die zweite Variante verwendet die hier gegebene Extension: Singleton, Serialisierung (Json, Xml) und Databinding ohne Dataset
    und ist eiglich überflüssig, weil eine Methode mit nur einer Zeile Inhalt - da kann man den Inhalt auch direkt aufrufen.
    Aber sowas wird dich wohl kaum interessieren.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @eichseinet Ich hab da eine etwas allgemeinere Klasse, XML-Dateien zu handeln:
    Spoiler anzeigen

    C#-Quellcode

    1. using System.IO;
    2. using System.Xml.Serialization;
    3. namespace Tools
    4. {
    5. /// <summary>
    6. /// Klasse zum Serialisieren und Deserialisieren
    7. /// im XML-Format
    8. /// </summary>
    9. public static class XmlFile
    10. {
    11. /// <summary>
    12. /// Objekt serialisieren
    13. /// </summary>
    14. /// <typeparam name="T">Typ des Objekts</typeparam>
    15. /// <param name="obj">das Objekt</param>
    16. /// <param name="filename">der Dateiname</param>
    17. public static void SerializeObject<T>(T obj, string filename)
    18. {
    19. using (FileStream fs = new FileStream(filename, FileMode.Create))
    20. {
    21. XmlSerializer ser = new XmlSerializer(typeof(T));
    22. ser.Serialize(fs, obj);
    23. }
    24. }
    25. /// <summary>
    26. /// Deserialisieren eines Objekts
    27. /// </summary>
    28. /// <typeparam name="T">Typ des Objekts</typeparam>
    29. /// <param name="obj">das Objekt</param>
    30. /// <param name="filename">der Dateiname</param>
    31. public static void DeserializeObject<T>(out T obj, string filename)
    32. {
    33. try
    34. {
    35. using (FileStream fs = new FileStream(filename, FileMode.Open))
    36. {
    37. XmlSerializer ser = new XmlSerializer(typeof(T));
    38. obj = (T)ser.Deserialize(fs);
    39. }
    40. }
    41. catch
    42. {
    43. obj = default(T);
    44. }
    45. }
    46. }
    47. }
    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!
    Erst mal Danke an euch beide.
    Genommen habe ich nun die erste Lösung von ErfinderDesRades. Die verstehe ich wenigstens vom Prinzip.
    Trotzdem gibt's noch ein paar Fragen zum Verständnis.
    @ErfinderDesRades:
    1. Du schwenkst von My.Computer.FileSystem.FileExists(Datei) auf System.IO.File.Exists(Datei) um. Ist die Variante besser, mächtiger, neuer, oder ist das einfach nur deine übliche Methode zum Dateizugriff?
    2. Noch interresanter ist aber warum Du im Code eine List(of T) statt gleich einer ObservableCollectio(of T) verwendest. Es funktioniert beides. Gibt es einen trifftigen Grund die List zu butzen, oder ist dir die ObservableCollection zu diesem Zweck einfach unnötig "aufwendig" / mächtig vom Aufbau her?

    Wieder was gelernt. Mir war nicht klar, dass man die Collection auch in ihrer Grundform nutzen kann. Bisher dachte ich man müsse die mit der gleichen Klasse übergeben, die für die ObserableCollection auch verwendet wird.
    Und noch kurz zu deinem Schlusssatz: Mir fehlt nicht unbedingt das Interesse, sondern das Verständniss für diese Form der Programmierung. Ich halte meinen Code gern möglichst simpel. So versteht man ihn auch Jahre später noch, ohne sich wieder in eine lange nicht mehr verwendete Technik neu einarbeiten zu müssen. Das ist nur ein Hobby und nicht mein Job. Da wird mal ein Projekt umgesetzt und dann kann auch mal 2-3 Jahre gar nix programmiert werden.

    GRuß

    eddi

    eichseinet schrieb:

    Du schwenkst von My.Computer.FileSystem.FileExists(Datei) auf System.IO.File.Exists(Datei) um. Ist die Variante besser, mächtiger, neuer, oder ist das einfach nur deine übliche Methode zum Dateizugriff?
    Die Variante ist dokumentiert.
    System.File ist dokumentiert - findeste im Objectbrowser. Der My - Namespace hingegen ist verborgen for whatever reasons.



    eichseinet schrieb:

    warum Du im Code eine List(of T) statt gleich einer ObservableCollectio(of T) verwendest.
    Ist schnurz.
    Ob ich nun eine List(Of T) umkopiere in eine OC, eine OC in eine andere umkopiere, oder ein Array - schnurz, wie gesagt.
    Das Umkopieren war deine Vorgabe - for whatever reasons.

    eichseinet schrieb:

    Mir fehlt nicht unbedingt das Interesse, sondern das Verständniss für diese Form der Programmierung. Ich halte meinen Code gern möglichst simpel. So versteht man ihn auch Jahre später noch...
    Dann solltest du aber Visual Studio - Empfohlene Einstellungen umsetzen.
    vb6-Schmuddelei beeinträchtigt sowohl Sicherheit als auch Verständlichkeit.
    Bereits Zeile #1 deines Codes wirft 3 Fragen auf, die nicht sinnvoll beantwortet werden können, und somit die Verständlichkeit deutlich einschränken:

    VB.NET-Quellcode

    1. Public Function XML_lesen(ByVal Datei As String, ByRef Coll As Object)
    • Was gibt diese Function zurück?
    • Warum ist Coll ByRef?
    • Warum ist Coll als Object deklariert?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    eichseinet schrieb:

    Ich halte meinen Code gern möglichst simpel. So versteht man ihn auch Jahre später noch, ohne sich wieder in eine lange nicht mehr verwendete Technik neu einarbeiten zu müssen.
    Da hat VB.ET und auch C# in der Version 42 ein nagelneues Sprach-Feature eingebaut, die Kommentarzeile:
    VB

    VB.NET-Quellcode

    1. ' Dies ist ein Kommentar
    C#

    C#-Quellcode

    1. // Dies ist ein Kommentar
    Damit kann jeder andere, der des Lesens mächtig ist, verstehen, was Du da zu Deinem Code zu kommentieren hast.
    Das ist schon dahingehend wichtiger als ein simpler Code, weil manche neuen Features halt nicht ganz simpel aussehen, z.B. LINQ-Konstrukte oder RegEx-Pattern.
    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!
    @ErfinderDesRades: zu den Fragen: 1. Da ich noch experimentierte und nihct genau wusste was alles gebraucht wird wurde eine Function erstellt. Beim Schreiben wurde klar, dass wohl gar keine Function mit Returnwert nötig sein wird. Nur noch nicht abgeändert.
    2. Ohne Byref ändert sich doch nur das Objekt innerhalb der Methode und nicht das übergebene Object im Original, oder?
    3. Es wurde als Object deklariert, weil mir bisher kein anderer Weg bekannt war die ObservableCollection zu übergeben, ohne ihren konkreten Typ anzugeben.

    @RodFromGermany: Geile Sache dieses "Kommentar". :) Ein Kommentar wär in diesem Fall aufwendiger als der zusätzliche Code für die etwas längere schreibweise. Ich will ja nicht nur wissen was in diesem Codeschnipsel getan wird, sondern wie und warum.

    Mir fällt der Umstieg auf die OOP und die WPF noch immer recht schwer. Es ist vieles neu und unterscheidet sich stark von dem simplen Code den ich noch unter Win Forms nutzen konnte. (da gab's auch OOP, war aber nicht nötig)

    Gruß

    eddi
    ich meinte das auch nur als Beispiel, wie "Schmuddel-Code" Verständlichkeit beeinträchtigt. Und die von mir mit viel Mühe beworbenen Einstellungen erschweren es deutlich, Schmuddelcode überhaupt zu verfassen.

    Zu 2) Das ist ein häufiges Missverständnis, oder nicht richtiges Verständnis von Referenz-Typen.
    Referenz-Typen werden als Referenz übergeben - quasi als "Zeiger" auf das Objekt. Die ObservableCollection, die in der Methode ankommt ist deswegen keine andere als jene, die der Aufrufer hat.
    Daher kann die Methode diese OC befüllen, und damit ist sie befüllt - auch beim Aufrufer - es ist ja dieselbe.

    Siehe hier: ByVal und ByRef - was macht jetzt genau was

    Bzw besorg dir ein gut Buch - das ist immer noch das beste Mittel, um in den Grundlagen sattelfest zu werden.
    gute Bücher gibts auch online bzw als gratis pdf.
    Hier sind u.a. welche aufgelistet: Entwickler-Ressourcen und Tools, Bücher und WebCasts

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades: Da haste recht; das hab ich anders verstanden. Leider wurde das auch in einem sehr bekannten Video-Grundkurs über C# nicht vollständig erklärt, oder auf den Unterschied hingewiesen. (da hab ich halt mein Halbwissen her) In dem Video gings nur um Wertetypen. Da hab ich nun vom Handling in diesem Fall keinen Unterschied gesehen und erwartet.
    Mit den Büchern tu ich mich noch etwas schwer, weil die guten scheinbar alle für C# geschrieben sind. Die Sprache mag ich gar nicht und immer das Überetzten in VB...
    Und dann die Zeit... Die Bücher werfen einen dann wieder mind. 6 Monate zurück; machens später aber wieder einfacher.
    Werde wohl nicht drumrum kommen welche zu bestellen. Leider kann ich mich nicht so recht entscheiden, was das Richtige für mich ist.

    Gruß

    eddi
    nein - kein buch bestellen. Wenn ich Links gebe - immer drauf klicken - ich mach das ja nicht, weil ich die blaue Schrift so toll finde, sondern ich denke mir was dabei.
    Und es gibt auch ausgezeichnete vb-Bücher: von Löffelmann oder von Kühnel/Leibhardt.
    für umsonst.
    Bücher kann man verschiedenartig lesen. Ich selbst hab auch nur wenig gelesen, und wenn, dann Themen auch nur flüchtig durchgeblättert, wenn ich mir des Themas sicher war. Oder wenn ich später drauf zurückkommen wollte.
    Bücher sind auch fabelhaft zum Nachschlagen: Kriegst ein Stichwort - ByRef, ByVal, ReferenzTyp, ValueType - und das schlägste nach.
    So gelesen können totale Langweiler-Bücher auf einmal total spannend sein, find ich.
    Und (gute) Bücher sind eben keine von Forum-Usern hingestümperte Halbwissen-Tutorials, sondern haben einen Vollständigkeits-Anspruch, sind didaktisch aufgebaut, also folgen einem inneren Zusammenhang, damit dir kein Stoff vorgesetzt wird, dessen Grundlagen erst 5 Kapitel später kommen.
    Mit den Hochsprachen ists halt auch so, dass alles mit allem zusammenhängt: Datentypen, ByRef/ByVal, Signaturen, anonyme Methoden, und und und...

    (Übrigens muss es auch massenhaft miserable c#-Bücher geben, weil ich finde, c#-Programmierer pflegen meist einen voll umständlichen Stil)
    Ich hab mir die beiden Links auch angesehen. Also nicht das schöne Blau, sondern die Seiten dahinter. :)
    Die Bücher von Löffelmann sind wohl nicht mehr kostenlos verfügbar. Beim Openbook von Kühnel/Leibhardt bin ich bei der Internetsuche schon häufiger gelandet. Übrigens ist eines der Bücher die ich als nicht so gut empfand in der Liste tatsächlich auch mit "Inhaltlich nicht empfehlenswert" markiert.
    Die Videos stamen übrigens aus einer kompletten Serie von einem, der das für seine Studenten gemacht hat. Er betreibt also sowohl die Programmierung als auch das Vermitteln beruflich.

    Danke für die Hilfe und Tipps.

    eichseinet schrieb:

    Die Videos stamen übrigens aus einer kompletten Serie von einem, der das für seine Studenten gemacht hat.
    Von wem was stammt ist nicht sehr aussagekräftig.
    Ich hab schon von Informatik-Uni-Dozenten gehört, die's nicht weiter wichtig fanden, Strict On zu programmieren.
    Grad Videos ist häufig (meist sogar) ein ganz ungeeignetes Medium.
    Da kannste dem Genie von der Alm beim Tippen in einen Editor zuschauen - ist doch Quatsch!
    Ich will doch nicht vom Bildschirm abschreiben - Code soll man zum Download stellen - das entlastet das Internet und vermeidet Abschreibfehler.
    Videos sind sinnvoll, wenn Umgang mit Tools zu zeigen ist, Designer etc.
    Oder wie inne Visual Studio - Empfohlene Einstellungen , wenn da Anfängern zugemutet wird, sich durch die verschiedensten Options-Dialoge zu klicksen.

    eichseinet schrieb:

    Beim Openbook von Kühnel/Leibhardt bin ich bei der Internetsuche schon häufiger gelandet. Übrigens ist eines der Bücher die ich als nicht so gut empfand in der Liste tatsächlich auch mit "Inhaltlich nicht empfehlenswert" markiert.
    Bist du sicher - verwechselst du das nicht mit Theiss?
    Weil Theiss ist leider sehr bekannt und inhaltlich grauenhaft.
    (aber vielleicht verstehe ich hier deinen Satz auch falsch)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Nein, ich hab die beiden nicht verwechselt. Die gibts beide online. Und dieser Theis ist wirklich nicht so gut wie Kühnel/Leibhardt. Ich glaub drei aus der Linkliste gibts bei Openbook.
    Ich seh grad, dass die BEIDEN anderen Bücher bei Openbook von Theis sind. Mit stark unterschiedlicher Aufmachung aus unterschiedlichen Jahren.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „eichseinet“ ()