Autor Beitrag
maxispv
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 14.05.12 10:30 
Hallo maxispv :welcome:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.05.12 10:32 
Hallo und :welcome:

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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Object Returnwert
 - int
 - eigener Datentyp
  - int
  - string
  - anderer Datentyp
   - string[]
   - int
 - string
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 14.05.12 11:52 
OK, hast du denn jetzt noch eine konkrete Frage dazu (oder ist jetzt die "Frage beantwortet")?
maxispv Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 14.05.12 12:32 
Man sollte noch Felder (Type.GetFields) ergänzen. Oder besser wirklich nur Properties verwenden ;)
maxispv Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: Mo 14.05.12 13:18 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Heißt auch nur Properties abgreifen ;)


Heißt aber auch, erst mal nicht selber machen zu müssen und auf ein gut getestetes Framework zurückgreifen zu können.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.05.12 14:23 
Wie sieht es denn bei dir im Moment aus? Eigentlich hast du schon fast den kompletten Quelltext. :gruebel:
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:
ausblenden C#-Quelltext
1:
myPropInfo.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance)					
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 14.05.12 15:15 
Zitat:
Oder könntest du mir mal ein kleines Beispiel zeigen wie du es meinst?

Pseudocode

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 14.05.12 16:53 
Danke allen habe es nun geschafft.

Hat irgend ein Knopf im Kopf, dass ich es nicht schnallte :roll: