Autor |
Beitrag |
maxispv
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 14.05.12 10:00
Guten Morgen
Ich habe ein Problem. In meiner Applikation wird eine Methode ausgeführt und ich bekommen ein Object zurück, welches verschachtelte komplexe Datentypen beinhalten kann. Diese verschachtelten komplexen Datentypen können jedoch wieder verschachtelte komplexe Datentypen beinhalten etc. etc.
Meine Frage ist wie ich das Object auslesen kann und die verschachtelten komplexen Datentypen in einer Baumartigen Darstellung ausgeben kann.
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 14.05.12 10:30
Hallo maxispv
steht die Struktur der Daten denn fest (oder aber willst du z.B. per Reflection alle Eigenschaften der Objekte auslesen)?
Und zur Darstellung von baumartigen Strukturen eignet sich ja zuallererst einmal ein TreeView, evtl. aber auch ein geschachteltes Grid.
Unter myCSharp - Verschachtelte Objekte/Listen performant anzeigen gab es mal eine ähnliche Anfrage mit weitergehenden Antworten.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 14.05.12 10:32
Hallo und
Das Stichwort ist Reflection, wenn es um beliebige Objekte und Strukturen geht. Hier findest du ein Beispiel:
stackoverflow.com/qu...harp-reflection-tree
Und hier die passende Doku:
msdn.microsoft.com/e...ibrary/kyaxdd3x.aspx
|
|
maxispv 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 14.05.12 10:42
Nein die Datenstruktur steht nicht fest. Die Struktur muss sollte per Reflection ausgelesen werden.
Die Datenstrucktur könnte etwa so aussehen.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Object Returnwert - int - eigener Datentyp - int - string - anderer Datentyp - string[] - int - string |
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 14.05.12 11:52
OK, hast du denn jetzt noch eine konkrete Frage dazu (oder ist jetzt die "Frage beantwortet")?
|
|
maxispv 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 14.05.12 12:03
Ich möchte die Ausgabe des Objects lieber in einer multiline Textbox ausgeben.
Mir ist aber immer noch nicht wirklich klar wie ich alle Datentypen rekursiv ausgeben kann.
Ich muss eine Ftunktion schreiben welche alle auch verschachtelten komplexen Datentypen ausgiebt und auf diese Funktion komme ich nicht.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 14.05.12 12:26
Wie wäre es mit der schon verlinkten Methode aus der Doku:
msdn.microsoft.com/e...ibrary/kyaxdd3x.aspx
Du musst, wenn es sich bei einem Feld wieder um ein Objekt handelt ( PropertyType == typeof(object)), noch einmal die eigene Funktion rekursiv aufrufen, aber ansonsten ist das doch schon fertig.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 14.05.12 12:32
Man sollte noch Felder ( Type.GetFields) ergänzen. Oder besser wirklich nur Properties verwenden 
|
|
maxispv 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 14.05.12 12:44
Ja mann muess es per Type.GetFields auslesen. Properties sind nicht vorhanden.
Mein einziges Problem ist noch wie ich dies rekursiv machen kann, das bekomme ich irgendwie nicht hin.
|
|
ujr
      
Beiträge: 102
Erhaltene Danke: 12
|
Verfasst: Mo 14.05.12 12:48
Hallo,
Du könntest Dir auch einen Serialisierer suchen, der in XML serialisiert. Dieses ist dann sehr einfach in eine Baumdarstellung zu überführen.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 14.05.12 13:05
Zitat: | Du könntest Dir auch einen Serialisierer suchen, der in XML serialisiert |
Die werden von gewissen qualitativen Merkmalen des Objektmodells ausgehen. Heißt auch nur Properties abgreifen 
|
|
ujr
      
Beiträge: 102
Erhaltene Danke: 12
|
Verfasst: Mo 14.05.12 13:18
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 14.05.12 13:28
Es wäre auf jedenfall die bessere Idee sein Modell so anzupassen das ein Standard Serializer damit umgehen kann (auch wenn man den dann vielleicht doch nicht verwendet) anstatt sich mit was selbst geschriebenen abzumühen.
Zitat: | Mein einziges Problem ist noch wie ich dies rekursiv machen kann, |
Das ist doch eher unproblematisch? Wenn du ein nicht rekursives Verfahren hast das für einen Typ flach die Properties/Felder ausliest dann musst du denn halt nur für jeden Typ wieder aufrufen.
Das natürlich unter der Annahme das deine Methode bereits Typen erkennt bei denen es nicht mehr die Properties/Felder (und deren eventuellen generische Parameter) dieses Typs abgrasen muss sondern dessen Wert einfach so ausgeben kann. (Build in Typen wie Integer-typen, Float-Typen, Char, String, Guid, DateTime etc. deren Nullable Varianten und alles anderen das ich sonst noch vergessen habe)
|
|
maxispv 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 14.05.12 14:13
nein das funktioniert eben nicht ganz so einfach mit dem wieder aufrufen, da es ja mehrere verschachtelte komplexe Datentypen geben kann.
Oder könntest du mir mal ein kleines Beispiel zeigen wie du es meinst?
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 14.05.12 14:23
Wie sieht es denn bei dir im Moment aus? Eigentlich hast du schon fast den kompletten Quelltext.
Du brauchst im Grunde nur in die Schleife, die durch die Liste der Properties geht, die Prüfung auf den Typ einbauen. ist es ein Objekt, ermittelst du dessen Properties und übergibst die an die eigene Methode rekursiv. So ca. müsstest du die bekommen: C#-Quelltext 1:
| myPropInfo.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance) |
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 14.05.12 15:15
Zitat: | Oder könntest du mir mal ein kleines Beispiel zeigen wie du es meinst?
|
Pseudocode
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| void MyRecursiveFunction(object obj) { if (ObjectIsSimpleType(obj)) Output(obj) else { FieldInfo[] infos = GetFieldInfosForThisInstance(obj); foreach(info in infos) { object value = info.GetValue(obj); MyRecursiveFunction(value); } } } |
Für diesen Beitrag haben gedankt: maxispv
|
|
maxispv 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 14.05.12 16:53
Danke allen habe es nun geschafft.
Hat irgend ein Knopf im Kopf, dass ich es nicht schnallte 
|
|