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)
                {
                    // Herausfinden von welchem Typ die Eigenschaft ist
                    TypeName = typeof(SettingManager).GetProperty(ts[i].Name);
                    TypeInfo = TypeName.PropertyType;

                    switch (TypeInfo.Name)
                    { 
                        case "Boolean":
                            ts[i].GetValue(Booli, null); // Hier ist der Fehler
                            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 user profile iconChristian 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.