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:
        /// <summary>
        /// Aufzählung für die xml Sections 
        /// </summary>
        public enum xml_sections
        {
            system,
            snapshot,
            bolt,
            scheduler
        }
        /// <summary>
        /// Aufzählung für die xml Namen (system)
        /// </summary>
        public enum xml_system
        {
            logpath,
            impexppath
        }
        /// <summary>
        /// Aufzählung für die xml Namen (snapshot)
        /// </summary>
        public enum xml_snapshot
        {
            Activ,
            Pgm,
            Parm,
            Gui,
            Filename,
            Hash_filename,
            Log_filename,
            Diff_filename
        }
        /// <summary>
        /// Aufzählung für die xml Namen (bold)
        /// </summary>
        public enum xml_bolt
        {
            Activ,
            Pgm,
            Servername,
            Email_to,
            Email_from,
            Bodytext,
            Subject
        }
        /// <summary>
        /// Aufzählung für die xml Namen (scheduler)
        /// </summary>
        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

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconChristian S.: C#- durch XML-Tags ersetzt


Kha - Mi 04.11.09 16:29

user profile iconSoc hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:


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