Zugriff auf Klasseneigenschaften über ein Array

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

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

    Zugriff auf Klasseneigenschaften über ein Array

    Hallo zusammen, meine erste Frage ans Forum:

    Ich habe eine Klasse mit vielen Eigenschaften. Es macht den Code gut verständlich, dass man jede Eigenschaft über ihren Namen ansprechen kann. Aber es ist sehr unpraktisch, wenn ich alle Eigenschaften in verschiedene Dateiformate rausschreiben oder einlesen will. Ich muss jedes Mal jede einzelne Eigenschaft hinschreiben. Wenn ich später Eigenschaften ändere oder weitere hinzufüge, muss ich das in allen betroffenen Prozeduren auch ändern.

    Ich würde gerne in der Klasse ein Array erstellen, dass die Namen und Verweise auf alle Eigenschaften enthält (quasi ByRef). Dann kann ich später mit einer simplen For-Schleife durch das Array laufen und alle Werte auslesen oder schreiben. Ich weiß nur nicht, ob und wie man die Variablen als Objekte und nicht ihre Werte in ein Array stecken kann. So dass man später auch über das Array den Wert der Variablen lesen/schreiben kann.

    Bisher habe ich nur mit Arrays gearbeitet, um Daten zu verwalten. Allerdings dieses Mal brauche ich ein Objektmodell aus verschiedenen Klassen, die Verweise aufeinander haben. Mein Lösungsansatz ist ein Mischmasch aus beidem. Ich bin sehr gespannt, wie ein Profi das handhabt.

    Vielen Dank für eure Hilfe

    Als Code könnte es ungefähr so aussehen:

    VB.NET-Quellcode

    1. Public Class Person
    2. Public ID As String = "P000000"
    3. Public CreationDate As Date = CDate("01.01.1900")
    4. Public FirstName As String = ""
    5. Public MiddleName As String = ""
    6. Public FamilyName As String = ""
    7. Public MaidenName As String = ""
    8. Public NameAffix As String = ""
    9. Public DateOfBirth As Date = CDate("01.01.1900")
    10. Public PlaceOfBirth As String = ""
    11. Public PhoneNumber As String = ""
    12. Public CellPhoneNumber As String = ""
    13. 'und einiges mehr
    14. Public P(,) As Object 'Array to provide all properties names, objects and formats
    15. Public Sub New()
    16. 'Fill the array with properties:
    17. ReDim P(2, 14)
    18. P(0, 0) = "ID"
    19. P(1, 0) = New Object() {ID} 'Kann man hier einen Verweis auf die Variable "ID" ins Array bekommen?
    20. P(2, 0) = "String"
    21. P(0, 1) = "CreationDate"
    22. P(1, 1) = New Object() {CreationDate}
    23. P(2, 1) = "String"
    24. 'usw.
    25. End Sub
    26. End Class
    27. Public Sub WriteToXML() 'Ich weiß, da gibts für XML spezielle Befehle. Ist nur ein Beispiel.
    28. '...
    29. For n As Integer = 0 To P.GetUpperBound(0)
    30. sw.WriteLine("<" & P(0, n) & ">" & P(1, n) & "</" & P(0, n) & ">" & vbCrLf) 'Kann man hier den Wert der verwiesenen Variable auslesen?
    31. Next
    32. '...
    33. End Sub
    34. Public Sub ReadFromExcel()
    35. '...
    36. For n As Integer = 0 To LastRow - 1
    37. For m As Integer = 0 To P.GetUpperBound(0)
    38. If WB.Cells(n + 1, 1).Value = P(0, m) Then
    39. P(1, m) = WB.Cells(n + 1, 2).Value 'Hier sollte idealerweise der gelesene Wert in der Variablen landen, auf die das Array-Feld verweist
    40. Exit For
    41. End If
    42. Next
    43. Next
    44. '...
    45. End Sub
    Handelt sich offenbar um Datensätze.
    Da empfehle ich dir, ein typisiertes Dataset zu verwenden, und nicht versuchen, selbst Datensatz-Klassen wie "Person" zu coden.

    Ist allerdings 'ne Menge Stoff zu lernen.
    Andererseits lernst du das sowieso, denn Laden, speichern, ändern, zufügen, löschen wirst du eh brauchen.
    Wenn du dich also nicht in typDataset einlernst - wo das optimal umgesetzt ist - dann wirst du das alles selbst erfinden müssen (angefangen hast du ja schon ;) ).

    vier Views-Videos bezieht sich genau auf diese Technologie, aber ohne den weiteren Kontext
    Datenverarbeitungs-Vorraussetzungen
    ist sehr ungewiss, ob du mit ersterem allein zum Ziel kommst.
    Hallo ErfinderDesRades

    Danke für die Antwort. Ich hab vor Jahren angefangen mit VB Makros für CATIA (muss man nicht kennen) zu programmieren.
    War lange mit VBA unterwegs und VB.NET ist um Welten umfangreicher.

    Ich habe tatsächlich angefangen das Datenmodell von CATIA abzukupfern: Dort gibt es Klassen und Collections
    Das wollte ich anwenden im Sinne von: Klasse "Person" verweist auf eine Collection "Verträge". Die verweist auf mehrere Objekte vom Typ "Vertrag".
    Diese wiederum auf eine Collection "Leistungen" usw. Da entsteht ein hirarchischer Baum mit diversen Querbeziehungen.
    Die Collections bekommen Methoden wie: Add, Count, GetItem...
    Bezüglich der Darstellung und Eingabemasken wollte ich mich an SmarTeam orientieren. Dort ist es sehr gut gelöst:
    Baumdarstellung mit hirarchischen Beziehungen, Profilkarten mit den Attributen,... wie in deinen Beschreibungen.

    Das DataSet ist genau der gesuchte Weg das alles solide aufzubauen. Wenn man dann auch mit Bordmitteln alles einfach nach
    XML schreiben / lesen kann und Funktionen zu den Datenobjekten dazuprogrammieren kann, lohnt es sich da reinzufuchsen.

    Besten Dank auch für die weiterführenden Beschreibungen dazu

    MD~Geist schrieb:

    Das wollte ich anwenden im Sinne von: Klasse "Person" verweist auf eine Collection "Verträge". Die verweist auf mehrere Objekte vom Typ "Vertrag".
    Diese wiederum auf eine Collection "Leistungen" usw. Da entsteht ein hirarchischer Baum mit diversen Querbeziehungen.
    Die Collections bekommen Methoden wie: Add, Count, GetItem...
    Was du beschreibst ist "nur" ein objektorientiertes Datenmodell (ausser mit "Querbeziehungen" sind m:n-Relationen gemeint - dann wäre es aber kein hierarchischer Baum mehr)
    Ein relationales Datenmodell, wie etwa ein typisiertes Dataset, kann das auch, geht aber noch ein Stück weiter, woraus sich eine exorbitant größere Leistungsfähigkeit ergibt. Gugge nochmal erfinderdesrades.unitweb.de/Pr…elationale Grundidee.html

    MD~Geist schrieb:

    lohnt es sich da reinzufuchsen.
    Auf jeden Fall :thumbsup: