Entwickler-Ecke
Sonstiges (.NET) - Anfängerfrage zu Reflections
Viertausend - Do 19.02.09 14:36
Titel: Anfängerfrage zu Reflections
Hallo,
ich mache gerade meine ersten Versuche mit C# und habe folgendes vor:
Ich möchte eine Klasse schreiben, welche all ihre öffentlichen Properties beim Disposen in die Registry schreibt. Ich habe mich dazu ein wenig informiert und habe erfahren dass dafür Reflections geeignet sind.
Ich habe nun in meiner Dispose() Methode die Ermittlung aller Eigenschaften implementiert, bekomme auch alle existierenden Properties zurückgeliefert, beim Auslesen derer Werte bekomme ich jedoch eine "TargetInvocationException":
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| public void Dispose() { string Str = ""; int Int32 = 0; bool Booli = false;
RegistryKey key = CreateSubKeyObj(); Type t = typeof(SettingManager); PropertyInfo TypeName; Type TypeInfo; PropertyInfo[] ts = t.GetProperties(BindingFlags.Instance | BindingFlags.Public);
for (int i = 0; i < ts.Length; i++) { if (ts[i].CanRead) { TypeName = typeof(SettingManager).GetProperty(ts[i].Name); TypeInfo = TypeName.PropertyType;
switch (TypeInfo.Name) { case "Boolean": ts[i].GetValue(Booli, null); key.SetValue(ts[i].Name, Booli);
break;
case "String": ts[i].GetValue(Str, null); key.SetValue(ts[i].Name, Str);
break;
case "Int32": ts[i].GetValue(Int32, null); key.SetValue(ts[i].Name, Int32);
break;
default: throw new Exception("Die Eigenschaft " + TypeName.Name + " ist vom nicht unterstütztem Typ " + TypeInfo.Name); } } } } |
Kann mir jemand weiterhelfen? Ich habe keine Ahnung weshalb mein Vorhaben mit getValue() scheitert!
PS:
Die Entwicklung erfolgt mit dem .NET 2.0 Compact Framework.
Grüße
4000
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
JüTho - Do 19.02.09 15:19
Hallo und :welcome:
Eine Antwort auf Deine eigentliche Frage habe ich nicht, aber ein paar Hinweise: Die Registry ist für so etwas nicht mehr üblich; stattdessen sind app.config und user.config die richtigen Wege. Reflection ist dazu gedacht, konkrete Situationen zu untersuchen; für Deine Zwecke ist Serialisierung das passende Stichwort.
Gruß Jürgen
Viertausend - Do 19.02.09 18:25
Hallo!
Vielen Dank für deine Antwort. Um das Thema Serialisierung hab ich mich noch nicht weiter gekümmert. Als Speicherort nicht mehr die Registry zu verwenden, macht u.U. Sinn:
Ich bin auf einen Artikel in der MSDN gestoßen:
http://msdn.microsoft.com/de-de/library/aa730869(vs.80).aspx
Jedoch finde ich bei mir unter dem Knoten "Properties" keine "Settings" oder vergleichbares. Außerdem gibt es bei mir die Klasse "Properties" nicht, mit denen ich zur Laufzeit auf die definierten Standard-Einstellungen zugreifen kann. Ist es Möglich das die ganze Einstellungsverwaltung im Compact Framework nicht zur Verfügung steht?
Grüße
4000
Kha - Do 19.02.09 20:53
Ebenfalls :welcome:
Wo man mit dem CF normalerweise Daten speichert, kann ich nicht sagen, aber den XmlSerializer gibt es auf jeden Fall auch dort.
Um auf deine Frage einzugehen: Schau dir GetValue mal in der Hilfe an:
| Zitat: |
Parameters
obj
Type: System..::.Object
The object [highlight]whose property value will be returned.
[/highlight]
index
Type: array<System..::.Object>[]()[]
Optional index values for indexed properties. This value should be nullNothingnullptra null reference (Nothing in Visual Basic) for non-indexed properties.
Return Value
Type: System..::.Object
The property value for the obj parameter.
|
PS: In C# werden Variablen normalerweise erst an dem Punkt deklariert, an dem man sie auch wirklich benötigt. Das erhöht die Übersicht ungemein.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!