Autor Beitrag
Viertausend
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 19.02.09 14:36 
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":

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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:
msdn.microsoft.com/d...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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

_________________
>λ=