Entwickler-Ecke
Basistechnologien - Object rekursiv auslesen
maxispv - Mo 14.05.12 10:00
Titel: Object rekursiv auslesen
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.
maxispv - 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 - Mo 14.05.12 11:52
OK, hast du denn jetzt noch eine konkrete Frage dazu (oder ist jetzt die "Frage beantwortet")?
maxispv - 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 - Mo 14.05.12 12:26
Wie wäre es mit der schon verlinkten Methode aus der Doku:
http://msdn.microsoft.com/en-us/library/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.
maxispv - 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 - 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 - 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 - Mo 14.05.12 13:18
Ralf Jansen hat folgendes geschrieben : |
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 - 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 - 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 - 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:
C#-Quelltext
1:
| myPropInfo.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance) |
Ralf Jansen - 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); } } } |
maxispv - Mo 14.05.12 16:53
Danke allen habe es nun geschafft.
Hat irgend ein Knopf im Kopf, dass ich es nicht schnallte :roll:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!