Forum: PC-Programmierung C#: Variablenname zur Laufzeit ausgeben (Reflexion?)


von Richard (Gast)


Lesenswert?

Hallo,

Problem: Ich möchte in ein ConfigFile ein paar Parameter schreiben. 
Diese Parameter liegen bereits in Variablen vor, deren Wert und deren 
Name (wegen der späteren Zuordnung bei Wiedereinlesen) praktisch nur 
noch in die Datei geschrieben werden muss.
C#2005.

Beispielcode:
[...]
Parameter Zeit; <-- die Variable Zeit ist vom Datentyp Parameter
Parameter Zeit2;
List <Parameter> ParameterListe = new List<Parameter>();
ParameterListe.Add(Zeit);
ParameterListe.Add(Zeit2);
Zeit  = LiesEin();      <-- Benutzer gibt z.B. 100 ein
Zeit2 = LiesEin();
SichereKonfiguration(); <-- diese Funktion will ich schreiben


In der ConfigDatei soll das dann so aussehen:
[Beginn der Datei]
Zeit=100
Zeit2=150
[Ende der Datei]


So funktionierts NICHT (liefert nicht den Variablennamen, sondern den 
String "Projekt.Parameter"):
void SichereKonfiguration()
{
  [Datei öffnen usw.]
  foreach (Parameter pm in ParameterListe)
  {
    ConfigFile.WriteLine(pm.ToString());  <-- was muss hier hin?
  }
}

Wie muss die Funktion "SichereKonfiguration" aussehen, wenn ich den 
Variablennamen (hier: Zeit und Zeit2) NICHT kenne(n will)!

Hintergrund:
- Es treten viele Variablen/Parameter auf, die gesichert werden sollen 
und gelegentlich kommen neue Variablen im Code hinzu. Ich will die 
Funktion "SichereKonfiguration" nicht jedesmal anpassen müssen.


Habe ich wichtige Infos vergessen?

Danke, Richard.

von Tobi O. (der_ossi)


Lesenswert?

hm... also direkt auf den namen zuzugreifen ist wohl etwas schwer, aber 
mach dir doch ein array, in dem du die namen, die vergeben werden 
einfach speicherst (weiss ja nicht wie viele parameternamen da vorkommen 
sollen, aber wenns nich allzuviele sind - wegen speicherbedarf - kannst 
du das ja so machen)... oder hab ich was falsch verstanden? g

von Richard (Gast)


Lesenswert?

Naja, damit verlagere ich das Problem ja nur, oder? Ich möchte ja nicht, 
dass ich die Variablennamen an zwei unterschiedlichen Stellen eingeben 
und konsistent halten muss.

> direkt auf den namen zuzugreifen ist wohl etwas schwer
Schwer oder unmöglich oder gar unsinnig?
Macht man das überhaupt so wie ich das jetzt angefangen habe?

Ich muss die Werte der Parameter eigentlich nur irgendwo fest ablegen 
und beim nächsten Programmstart wieder einlesen können. Wie ist da das 
Standardvorgehen?

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

erstell dir eine Klasse die deine ganzen Konfig-Infos hält und 
serialisier das Teil in eine XML-Datei. Die kannst du dann beim nächsten 
Starten wieder in ein Konfigobjekt "wandeln". Wenn natürlich Parameter 
dazukommen und das ganze rückwärtkompatibel bleiben soll wirds 
schwieriger.

Matthias

von arc (Gast)


Lesenswert?

Standardvorgehen: Wenn es tatsächlich Anwendungseinstellungen sind, dann 
kann man dies in den Projekteinstellungen machen 
(Projekt->Eigenschaften->Einstellungen). Sowohl für globale, als auch 
für Benutzereinstellungen. Der Zugriff im Programm erfolgt dann z.B. 
über Settings.Default.Zeit2. Gespeichert werden diese mit 
Settings.Default.Save()

Der anderer übliche Weg ist, wie schon gesagt, z.B. über XmlSerializer
Codeausschnitt z.B. hier:
Beitrag "serialisieren eines Array von Klassen"

Per Reflection geht es zwar auch...
1
  Type t = typeof(aType);
2
  // alle "Felder" einer Instanz auflisten
3
  System.Reflection.FieldInfo[] fi =  
4
    t.GetFields(System.Reflection.BindingFlags.Instance |  
5
                System.Reflection.BindingFlags.Static | 
6
                System.Reflection.BindingFlags.NonPublic | 
7
                System.Reflection.BindingFlags.Public);
8
  foreach (System.Reflection.FieldInfo f in fi) {
9
      string str = f.Name + " = " + f.GetValue(this).ToString();
10
  }


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.