Entwickler-Ecke
Sonstiges (.NET) - variabler Zugriff auf verschiedene Enum
Soc - Mi 04.11.09 12:19
Titel: variabler Zugriff auf verschiedene Enum
Hallo Zusammen,
ich kämpfe gerade mit Enums rum.
Enums:
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: 50: 51: 52: 53: 54:
| public enum xml_sections { system, snapshot, bolt, scheduler } public enum xml_system { logpath, impexppath } public enum xml_snapshot { Activ, Pgm, Parm, Gui, Filename, Hash_filename, Log_filename, Diff_filename } public enum xml_bolt { Activ, Pgm, Servername, Email_to, Email_from, Bodytext, Subject } public enum xml_scheduler { Activ, Log_savetime, Resumebackup } |
Ich möchte abhängig von den der Aufzählung im Enum xml_sections auf das entsprechende Enum zugreifen.
Bisher löse ich das (sehr unschön) so:
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: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| foreach (GlobVar.xml_sections section in Enum.GetValues(typeof(GlobVar.xml_sections))) { object _section = section; NameValueCollection XmlSys = (NameValueCollection)ConfigurationManager.GetSection("snapshotGUI/" + section);
switch (_section.ToString()) { case "system": foreach (GlobVar.xml_system item in Enum.GetValues(typeof(GlobVar.xml_system))) { string _xmlname = item.ToString(); if (XmlSys[_xmlname] != null) { Console.WriteLine("Section: " + _section.ToString() + " Variable: " + _xmlname + "=" + XmlSys[_xmlname]); } else { Console.WriteLine("Variable: " + _xmlname + " ist nicht vorhanden."); } } break; case "snapshot": foreach (GlobVar.xml_snapshot item in Enum.GetValues(typeof(GlobVar.xml_snapshot))) { string _xmlname = item.ToString(); if (XmlSys[_xmlname] != null) { Console.WriteLine("Section: " + _section.ToString() + " Variable: " + _xmlname + "=" + XmlSys[_xmlname]); } else { Console.WriteLine("Variable: " + _xmlname + " ist nicht vorhanden."); } } break; case "bolt": foreach (GlobVar.xml_bolt item in Enum.GetValues(typeof(GlobVar.xml_bolt))) { string _xmlname = item.ToString(); if (XmlSys[_xmlname] != null) { Console.WriteLine("Section: " + _section.ToString() + " Variable: " + _xmlname + "=" + XmlSys[_xmlname]); } else { Console.WriteLine("Variable: " + _xmlname + " ist nicht vorhanden."); } } break; case "scheduler": foreach (GlobVar.xml_scheduler item in Enum.GetValues(typeof(GlobVar.xml_scheduler))) { string _xmlname = item.ToString(); if (XmlSys[_xmlname] != null) { Console.WriteLine("Section: " + _section.ToString() + " Variable: " + _xmlname + "=" + XmlSys[_xmlname]); } else { Console.WriteLine("Variable: " + _xmlname + " ist nicht vorhanden."); } } break; } } |
Also redudanter Code für jede Enum.
Wie bekomme ich es hin das ich den Enum Name in der foreach Schleife dynamisch einsetze ?
Gruß
Soc
JüTho - Mi 04.11.09 13:06
Hallo,
ich bin mir nicht sicher, ob ich alles verstanden habe. Mein Gedanke ist:
1. Deklariere _section nicht als object, sondern als Enum.
2. Dann kannst du mit
Enum.Parse auswerten.
Das sieht dann etwa so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| Enum obj; try { obj = Enum.Parse( typeof(_section), value ); } catch { obj = null; } |
Wie gesagt: nur ein Gedanke, aber vielleicht bekommst du eine erfolgreiche Richtung.
Gruß Jürgen
Kha - Mi 04.11.09 14:06
Was hast du denn insgesamt vor? Enums scheinen mir hier keine passende Wahl zu sein.
Soc - Mi 04.11.09 15:01
Kha hat folgendes geschrieben : |
Was hast du denn insgesamt vor? Enums scheinen mir hier keine passende Wahl zu sein. |
Ich möchte aus folgender appl.config Daten lesen und in Variablen abspeichern.
appl.config:
XML-Daten
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:
| <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <sectionGroup name="snapshotGUI"> <section name="system" type="System.Configuration.NameValueSectionHandler"/> <section name="snapshot" type="System.Configuration.NameValueSectionHandler"/> <section name="bolt" type="System.Configuration.NameValueSectionHandler"/> <section name="scheduler" type="System.Configuration.NameValueSectionHandler"/> </sectionGroup> </configSections>
<snapshotGUI> <system> <add key="logpath" value="\Logs\"/> <add key="impexppath" value="\Backup\"/> </system> <snapshot> <add key="Activ" value="true"/> <add key="Pgm" value="snapshot.exe"/> <add key="Parm" value="-R -W -VSS=Use"/> <add key="Gui" value="-Go"/> <add key="Filename" value="Backup_$computername_$Disk_$Year$Month$day.sna"/> <add key="Hash_filename" value="[Backup-Filename].hsh"/> <add key="Log_filename" value="[Backup-Filename].log"/> <add key="Diff_filename" value="[Backup-Filename]_$time_Diff.sna"/> </snapshot> <bolt> <add key="Activ" value="true"/> <add key="Pgm" value="blat.exe"/>
<add key="Servername" value="SERVER01"/> <add key="Email_to" value="admin@domain.local"/> <add key="Email_from" value="SnapShot@domain.local"/> <add key="Bodytext" value="[Backup-Filename].log"/> <add key="Subject" value="Backup $computername($Backuptype) - (Drive: $disk(s)) - Date($date) - Elapsed Time($time) - User($user) - RC($returnCode Backup/$returnCode SendMail)"/> </bolt> <scheduler> <add key="Activ" value="true"/> <add key="Log_savetime" value="00:00"/> <add key="Resumebackup" value="true"/> </scheduler> </snapshotGUI>
</configuration> |
Alle Werte sollen in eine dazu passende Variable geschrieben werden.
Sicherlich sind Enums unpassend, da ich sie immer ändern muss wenn sich was an der config ändert.
Der Variablen-Name (soll gleich lauten wie in Section und key= benannt - z.B. var_system_logpath) soll während der Laufzeit angelegt werden und mit den entsprechenden Wert aus der xml gefüllt werden.
Das Beispiel oben soll einfach nur alle Namen mit Inhalt ausgeben.
Wie ich aber den richtigen Variablen Name finde und dann deklarieren und setzen kann ist mir noch nicht bekannt.
Gruß
Soc
Moderiert von
Christian S.: C#- durch XML-Tags ersetzt
Kha - Mi 04.11.09 16:29
Soc hat folgendes geschrieben : |
Der Variablen-Name (soll gleich lauten wie in Section und key= benannt - z.B. var_system_logpath) soll während der Laufzeit angelegt werden |
Das geht eben nicht, Variablen müssen natürlich zur Kompilierzeit definiert werden. Aber was spricht denn gegen sowas:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var config = new Dictionary<string, NameValueCollection>();
foreach (GlobVar.xml_sections section in new[] { "system", "snapshot", "bolt", "scheduler" }) { var section = (NameValueCollection)ConfigurationManager.GetSection("snapshotGUI/" + section); config.Add(section); }
Console.WriteLine(config["bolt"]["Subject"]); ... |
Soc - Mi 04.11.09 16:52
Kha hat folgendes geschrieben : |
foreach (GlobVar.xml_sections section in new[] { "system", "snapshot", "bolt", "scheduler" }) {
var section = (NameValueCollection)ConfigurationManager.GetSection("snapshotGUI/" + section);
config.Add(section);
}
Console.WriteLine(config["bolt"]["Subject"]);
...[/cs] |
Dabei gibt es zwei Fehlermeldungen:
Fehler 2 Eine Konvertierung vom Typ "string" in "GlobalClass.GlobVar.xml_sections" ist nicht möglich.
Fehler 3 Keine Überladung für die Add-Methode nimmt 1 Argumente an.
Des Weiteren kam der Name section doppelt vor.
Habe es wie folgt ändern müßen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var config = new Dictionary<string, NameValueCollection>();
foreach (GlobVar.xml_sections sektion in new[] { "system", "snapshot", "bolt", "scheduler" }) { var section = (NameValueCollection)ConfigurationManager.GetSection("snapshotGUI/" + sektion); config.Add(section); }
Console.WriteLine(config["bolt"]["Subject"]); |
Gruß
Soc
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!