www.mikrocontroller.net

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


Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobi O. (der_ossi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Richard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
  Type t = typeof(aType);
  // alle "Felder" einer Instanz auflisten
  System.Reflection.FieldInfo[] fi =  
    t.GetFields(System.Reflection.BindingFlags.Instance |  
                System.Reflection.BindingFlags.Static | 
                System.Reflection.BindingFlags.NonPublic | 
                System.Reflection.BindingFlags.Public);
  foreach (System.Reflection.FieldInfo f in fi) {
      string str = f.Name + " = " + f.GetValue(this).ToString();
  }


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.