Autor Beitrag
Soc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: Mi 04.11.09 12:19 
Hallo Zusammen,

ich kämpfe gerade mit Enums rum.

Enums:
ausblenden volle Höhe 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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 04.11.09 14:06 
Was hast du denn insgesamt vor? Enums scheinen mir hier keine passende Wahl zu sein.

_________________
>λ=
Soc Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: 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:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: 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:

ausblenden 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