Alle Instanzen einer Klasse innerhalb einer Klasse durchgehen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Alle Instanzen einer Klasse innerhalb einer Klasse durchgehen

    Hallo,

    ich komme einfach nicht drauf, wie alle Instanzen einer Klasse innerhalb einer Klasse durchgehen kann. Der Code ist selbsterklärend, denke ich:

    VB.NET-Quellcode

    1. Friend Class clsKlasseInfos
    2. Friend Wert As String
    3. Friend Property Info As String
    4. Get
    5. Return Wert
    6. End Get
    7. Set(value As String)
    8. Wert = value
    9. End Set
    10. End Property
    11. End Class
    12. Friend Class clsKlasse1
    13. Friend Klasse2a As New clsKlasseInfos
    14. Friend Klasse2b As New clsKlasseInfos
    15. Friend Klasse2c As New clsKlasseInfos
    16. Friend Klasse2d As New clsKlasseInfos
    17. For Each c As clsKlasseInfos In ????
    18. c.Info="test"
    19. Next
    20. End Class
    --------
    Lieber inkompetent als inkontinent
    Hi,

    du könntest dafür natürlich Reflection verwenden, aber ich glaub es wäre sinnvoller darüber nachzudenken was du genau erreichen möchtest.
    Es wäre möglich und auch besser zum Beispiel eine List<clsKlasseInfo> zu verwenden, diese könntest du dann einfach durchlaufen.
    Was soll denn clsKlasse1 denn für eine Funktion haben ? clsKlasseInfo erscheint mir ja recht sinnvoll, auch wenn ich das cls im Namen weglassen würde.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    @100Volt Geht so nicht.
    Wenn Du weißt, dass Du alle Instanzen durchleiern willst, packe sie in eine List(Of clsKlasseInfos), die kannst Du dann genau so durchgehen.
    Und:
    Was soll die Bezeichnung clsKlasseXXX :?:
    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 Beispiel ist recht sinnfrei, es sollte nur mein Problem darstellen :)
    Es geht um das zusammenstellen von SQL-Kommandos.

    Nun so:

    VB.NET-Quellcode

    1. Friend Class clsKlasseInfos
    2. Friend Wert As String
    3. Friend Property Info As String
    4. Get
    5. Return Wert
    6. End Get
    7. Set(value As String)
    8. Wert = value
    9. End Set
    10. End Property
    11. End Class
    12. Friend Class clsKlasse1
    13. Friend Klasse2a As New clsKlasseInfos
    14. Friend Klasse2b As New clsKlasseInfos
    15. Friend Klasse2c As New clsKlasseInfos
    16. Friend Klasse2d As New clsKlasseInfos
    17. Friend l As List(Of clsKlasseInfos)
    18. Sub ini()
    19. l.Add(Klasse2a)
    20. l.Add(Klasse2b)
    21. l.Add(Klasse2c)
    22. l.Add(Klasse2d)
    23. End Sub
    24. Sub test()
    25. For Each c As clsKlasseInfos In l
    26. c.Info = "test"
    27. Next
    28. End Sub
    29. End Class



    So funktioniert es zwar, aber ich muß jede erzeugte Instanz der Klasse clsKlasseInfos nochmals zur List hinzufügen. Ändere ich etwas am Quellcode, muß ich immer daran denken. Vielleicht ist die Varianmte mit Reflection insofern "besser". Ich hatte mich mit Reflection auch schon versucht, es jedoch nicht hinbekommen. Wie verwende ich das richtig?
    --------
    Lieber inkompetent als inkontinent

    100Volt schrieb:

    Reflection
    Lass es sein :!:
    Und dann so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Friend Class clsKlasseInfos
    2. Friend Property Info As String
    3. End Class
    4. Friend Class clsKlasse1
    5. Friend l As List(Of clsKlasseInfos)
    6. Sub ini()
    7. l.Add(New clsKlasseInfos)
    8. l.Add(New clsKlasseInfos)
    9. l.Add(New clsKlasseInfos)
    10. l.Add(New clsKlasseInfos)
    11. End Sub
    12. Sub test()
    13. For Each c As clsKlasseInfos In l
    14. c.Info = "test"
    15. Next
    16. End Sub
    17. End Class

    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 habe es dank Eurer Anregungen nun so gelöst:

    VB.NET-Quellcode

    1. Friend Class clsKlasseInfos
    2. Private Wert As String
    3. Private ParentClass As Object
    4. Sub New(ByRef Parent As clsKlasse1, ByVal StartWert As String)
    5. ParentClass = Parent
    6. Wert = StartWert
    7. CType(ParentClass, clsKlasse1).ListAdd(Me)
    8. End Sub
    9. Sub New(ByRef Parent As clsKlasse2, ByVal StartWert As String)
    10. ParentClass = Parent
    11. Wert = StartWert
    12. CType(ParentClass, clsKlasse2).ListAdd(Me)
    13. End Sub
    14. Friend Property Info As String
    15. Get
    16. Return Wert
    17. End Get
    18. Set(value As String)
    19. Wert = value
    20. End Set
    21. End Property
    22. End Class
    23. Friend Class clsErbenswerteFunktionen
    24. Friend l As New List(Of clsKlasseInfos)
    25. Friend Function AlleKlassenDurchlaufen() As String
    26. Dim strbld As New System.Text.StringBuilder(1000)
    27. For Each c As clsKlasseInfos In l
    28. strbld.Append(c.Info)
    29. Next
    30. Return strbld.ToString
    31. End Function
    32. Friend Sub ListAdd(ByRef i As clsKlasseInfos)
    33. l.Add(i)
    34. End Sub
    35. End Class
    36. Friend Class clsKlasse1
    37. Inherits clsErbenswerteFunktionen
    38. Friend Klasse2a As New clsKlasseInfos(Me, "Apfel")
    39. Friend Klasse2b As New clsKlasseInfos(Me, "Birne")
    40. Friend Klasse2c As New clsKlasseInfos(Me, "Krautsalat")
    41. End Class
    42. Friend Class clsKlasse2
    43. Inherits clsErbenswerteFunktionen
    44. Friend Klasse2a As New clsKlasseInfos(Me, "Pommes")
    45. Friend Klasse2b As New clsKlasseInfos(Me, "Ketchup")
    46. Friend Klasse2c As New clsKlasseInfos(Me, "Mayo")
    47. End Class



    Damit kann ich immer noch übersichtlich auf die Eigenschaften und Funktionen der Klassen zugreifen:

    VB.NET-Quellcode

    1. Dim s As String
    2. s = modDB.KlassTest.Klasse2a.Info
    3. modDB.KlassTest.Klasse2a.Info = "Salat"
    4. s = modDB.KlassTest.AlleKlassenDurchlaufen
    5. s = modDB.KlassTest2.AlleKlassenDurchlaufen



    Vielen Dank nochmals!
    --------
    Lieber inkompetent als inkontinent
    Ich weiss nicht genau was du wirklich damit machen willst, aber ich bin mir sicher das es anders auch geht.
    Du kannst ja deiner Klasse clsKlasseInfos auch eine Property Namen geben, wo dann zB Klasse2a drin steht, wenn du das brauchst.
    Dann kannst du sie einer Liste hinzufügen und im Zweifel über den Namen finden und benötigst die einzelnen Properties gar nicht sondern eigentlich nur eine Liste.
    Das ist meine Signatur und sie wird wunderbar sein!
    Oder über ein Dict in Kombi mit ner Enum:

    VB.NET-Quellcode

    1. Public Class clsKlasseInfos
    2. Friend Property Info As String
    3. End Class
    4. Public Class Class1
    5. Public Enum ClassNames
    6. A2
    7. A3
    8. B2
    9. B3
    10. End Enum
    11. Private dict As New Dictionary(Of ClassNames, clsKlasseInfos)
    12. Public Sub Init()
    13. For Each name As ClassNames In [Enum].GetValues(GetType(ClassNames))
    14. dict.Add(name, New clsKlasseInfos)
    15. Next
    16. End Sub
    17. Public Sub Test()
    18. For Each name As ClassNames In dict.Keys
    19. dict(name).Info = "test"
    20. Next
    21. End Sub
    22. Public ReadOnly Property GetKlassenInfo(name As ClassNames) As clsKlasseInfos
    23. Get
    24. Return dict(name)
    25. End Get
    26. End Property
    27. End Class

    Mono schrieb:

    Ich weiss nicht genau was du wirklich damit machen willst, aber ich bin mir sicher das es anders auch geht.
    Ja, so geht es mir auch. Das ganze Konstrukt sieht aus, als wenn da jemand das Prinzip von Klassen und deren Instanzen nicht verstanden hätte.

    Ist das Ziel, alle Eigenschaften einer Klasse in einen „SQL-Befehl“ zu basteln? Das würde ich dann nämlich per Reflection (wenn verschachtelte Klassen dann Rekursiv) machen.

    Vielleicht erklärt der TE nochmal ohne Code (oder mit dem echten) was da das Ziel sein soll.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Das Ziel ist, die Eigenschaften der Tabellen(spalten) einer mySQL-Datenbank an zentraler Stelle im Code zu definieren und irgendwo im Code in übersichtlicher Weise darauf zugreifen zu können. Ein paar Hilfsfunktionen kommen noch hinzu, so daß z.B. die SQL-Kommandos automatisch generiert werden.
    --------
    Lieber inkompetent als inkontinent
    Aha ok jetzt wirds klarer. Geht also bissl in die Entity Framework Richtung.

    Du könntest beim Programmstart das DB Schema in ein DataSet laden. Da sind dann alle Tabellen, Spalten und deren Datentypen enthalten. Da kann man dann auch durch iterieren um SQL-Statements zu generieren.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich habe mir das Thema Dataset ein paar Stunden lang angesehen. Wenn ich es richtig verstehe, kann ich im Visual Studio (2019 Ent.) meine ganze Datenbank designen und übersichtlich darstellen. Das Erstellen der so definierten Tabellen in der (vorhandenen aber leeren) Datenbank zur Laufzeit funktioniert aber nicht, oder?

    Die Spalten im DataTable haben die Eigenschaften Caption und Name. Das ist aber beides nicht das, was ich bei einem SQL-Kommando mit AS (Alias) angeben kann, oder? Zumindest der Beschreibung nach nicht.
    --------
    Lieber inkompetent als inkontinent
    Ja, korrekt. Das heißt doch aber nicht, daß ich es nicht auch besser bzw. eleganter lösen könnte. Man befindet sich als selbstkritischer Mensch doch gerne fortwährend in einem kontinuierlichen Verbesserungsprozeß, oder etwa nicht? :)
    --------
    Lieber inkompetent als inkontinent
    ok, fein!
    Derzeit sind dir soweit ich sehe, 3 verschiedene Ansätze vorgeschlagen worden, und eingehen tust du auf keinen, sondern auf einen noch ganz anderen Ansatz.
    Da frag ich mich schon wieder, was diskutiert wird, nun aus anderem Grund.

    Also ich antworte mal auf dieses - weil es von dir kommt (auf anderes mögen andere antworten)

    100Volt schrieb:

    Ich habe mir das Thema Dataset ein paar Stunden lang angesehen. Wenn ich es richtig verstehe, kann ich im Visual Studio (2019 Ent.) meine ganze Datenbank designen und übersichtlich darstellen. Das Erstellen der so definierten Tabellen in der (vorhandenen aber leeren) Datenbank zur Laufzeit funktioniert aber nicht, oder?
    Stimmt - das funktioniert nicht.
    Macht in deinem Fall aber nichts, weil du kannst das Dataset viel einfacher direkt auf Platte schreiben - eine Datenbank brauchst du garnet.

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

    Letztlich soll es folgendes werden:
    Es gibt eine mySQL-Datenbank auf einem Webserver. Die Datenbank wird über das Kundenportal des Webhosters erstellt und ist leer. Meine Anwendung zunächst die notwendigen Tabellen erstellen und später in die Tabellen schreiben und daraus lesen. Einige Tabellen werden recht schnell sehr viele Datensätze haben, außerdem wird von verschiedenen Standorten auf die Datenbank zugegriffen (incl. Veränderungen des Datenbestandes). Zumindest bei einigen Tabellen scheidet daher ein „offline verfügbar machen“ und damit längerfristig arbeiten aus.
    Vor etlichen Jahren habe ich in einem Projekt mit SQL gearbeitet und die Tabelleneigenschaften mit Hilfe von Strukturen definiert. Das funktionierte zwar soweit, war aber ganz sicher weit entfernt von dem, wie man es eigentlich machen soll. Das wollte ich nun besser machen.
    Meine anfängliche Idee war nun mit Klassen zu arbeiten. Eine Klasse für die Spalteneigenschaften, eine für die Tabelleneigenschaften und eine mit Funktionen, die geerbt werden. Vom Code her ist das schon übersichtlicher und funktioneller als damals. Nun gab es mehrere Vorschläge aus dem Forum, die allesamt interessant waren, mich aber das DataSet (Vorschlag von mrMo) insofern beeindruckte, als daß ich damit in meinem gesamten Vorhaben offenbar viel mehr machen kann, als nur meine Tabellen abzubilden um sie dann doch wieder in selbst zusammengestrickten SQL-Kommandos anzulegen.
    Auf der späteren Modifikation der Datenbank(tabellen) liegt mein Fokus nicht.
    --------
    Lieber inkompetent als inkontinent
    Ich glaub, du hast Mr.Mos Vorschlag falsch verstanden.
    Was er von Dataset schreibt ist, dass man zur Laufzeit das DB-Schema in ein Dataset laden könne.
    Hmm - das ist ja auch inhaltlich falsch.
    Also ich versteh MrMos Vorschlag grad garnet - "zur Laufzeit"??
    Na schön, man kann - wenn deine DB und dein Webhoster mitspielen, alle möglichen MetaDaten von der DB abrufen.
    Und du kannst diese MetaDaten auch als untypisierte DataTables einem Dataset zufügen.

    Ist ein ziemlicher Aufriss. Und was versprichst du dir davon, zur Laufzeit MetaDaten von der DB abzurufen?
    Ich meinte allgemein die Verwendung von DataSet, nicht genau so wie er es vorgeschlagen hat. Zuvor habe ich mich nie mit DataSet beschäftigt.
    Wie die Datenbank aufgebaut sein soll, steht ja schon fest, dann kann ich im Quellcode oder in einer lokalen (mitgelieferten) XML-Datei hinterlegen. Metadaten möchte ich keine abrufen; vielleicht habe ich mich diesbezüglich etwas unglücklich ausgedrückt.
    --------
    Lieber inkompetent als inkontinent