C#: Variablenname zur Laufzeit ausgeben (Reflexion?)

Gast #468587
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.
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
Gast
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?
Gast
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
  }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.