Laden...

Reflection Problem

Erstellt von Lynix vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.329 Views
L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 17 Jahren
Reflection Problem

Hallo zusammen !

Ich hab folgendes Problem :


else if(pInfo.PropertyType == typeof(ArrayList))
			{
				ArrayList datalist = (ArrayList)pInfo.GetValue(dataObject, null);
				
				foreach(object obj in datalist)	
				{										
					Type t = obj.GetType();
				
					foreach(PropertyInfo ppInfo in t.GetProperties())
						AddPropertyToTree(ppInfo, obj);				
				}
			}

Ich versuche mit diesem Code, die Properties eines Objektes in einer Arrayliste auszulesen und in einer Baumartigen Datenstruktur abzulegen. Das Ganze wird als Config-Reader benutzt.

An der Stelle, wo ich Type t = obj.GetType() aufrufe, kriege ich blöderweise einen Typ "System.RuntimeType" zurück, und die Abfrage auf t.GetProperties in der foreach-Schleife macht dann nichts, da RuntimeType anscheinend keine Properties hat.

Ich bin aber sicher, dass in die ArrayListe nie ein "RuntimeType" reingesteckt wurde. Wenn ich es mir im Debugger anschaue zeigt er mir auch unter t.FullName "MyProject.AxisDescription" als Typname an.

Wie kann ich nun aus diesem ominösen System.RuntimeType den echten, darin verborgenen Typ rausholen ?

Danke schonmal

"It is not wise to be wise" - Sun Tzu

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo Lynix,

warum nicht System.Type.GetProperties()?

Siehe hier:
MSDN - System.Type.GetProperties

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 17 Jahren

Sorry, ich glaub ich verstehe dich nicht ganz, genau diese Methode rufe ich doch in der foreach-Schleife auf ?

Allerdings gibt diese mir ein leeres PropertyInfo-Array zurück, da in dem Type nicht der "echte" Type drinsteckt, sondern ein System.RuntimeType.

"It is not wise to be wise" - Sun Tzu

4.506 Beiträge seit 2004
vor 17 Jahren

Sorry Lynix,

hab ich irgendwie komplett falsch (zu schnell) gelesen, ich hab gedacht, du überprüfst jeden Typ auf "isProperty", mein Fehler!

Ignorieren 😉

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 17 Jahren

Ok, ich ignoriere es, aber nur wenn Du jetzt auch eine Lösung hast 😁

"It is not wise to be wise" - Sun Tzu

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,

was für Objekte stahen denn in Deiner DataList ?
Einen RuntimeType erhälst Du z.B. wenn du GetType() auf einem Objekt rufst, welches selber ein Type ist.
Wenn also bei "obj.GetType" obj selbst ein Type ist, ist der Effekt klar....

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Lynix,

ich habe deinen Code probiert und bei mir geht er. Ich gehe daher davon aus, dass in deiner ArrayList - warum auch immer - tatsächlich RuntimeType-Objekte enthalten sind.

herbivore

L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 17 Jahren

Das Problem hat sich erledigt, ich war selbst dran schuld...

Die Objekte, die in der Arraylist steckten hatten garkeine Properties, sondern nur public Members. Das mit dem RuntimeType ist normal, das ist eine interne Klasse des Frameworks, den man immer zurückkriegt wenn man mit Reflection arbeitet. Dieser RuntimeType hat aber intern den "echten" Type mit drin und man kann den RuntimeType ganz normal als den "echten" Type benutzen.

Ist also kein Problem mehr, es sieht nur verwirrend aus im Debugger - und das eigentliche Problem lag darin, dass man eben keine Properties rausnehmen kann wo keine Properties drin sind 🙂

Trotzdem danke an alle.

"It is not wise to be wise" - Sun Tzu