Entwickler-Ecke

IO, XML und Registry - mehrere werte aus configfile für dieselbe Funktion


schickmaster - Mo 22.11.10 16:12
Titel: mehrere werte aus configfile für dieselbe Funktion
Hallo,

ich will aus einer config file daten in ein Byte array schreiben und anschließend mehrere byte arrays aus dem configfile ein eine funktion übergeben. wie kann ich das am besten machen? ich kann bisher nur einzelne werte aus dem config einlesen, bei mehrere gits einen fehler.


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="yval" value="320" />
    <add key="xval" value="240" />
    <add key="Wert" value="1, 34" />
    <add key="Wert" value="2, 255" />


  </appSettings>
</configuration>


C#-Quelltext
1:
2:
3:
  byte [] wert = (byte [])config.GetValue("Wert"typeof(byte []));

dev.SPI_Write(wert, 2, Sub20.SpiSS_LO);


leider wird nur der letzte wert geschrieben, und auch nur, wenn ich eine einzelne zahl angebe.
kennt jemand eine lösung?

gruss alex


Moderiert von user profile iconKha: Topic aus C# - Die Sprache verschoben am Mo 22.11.2010 um 18:51


Trashkid2000 - Mi 24.11.10 22:42

Hi,

also, die Werte in einer Anwendungskonfigurationsdatei werden beim auslesen als NameValueCollection behandelt. Jedenfalls soviel ich weiß. Dabei ist der Name vom Typ string, und der Value auch.
Wenn Du also aus mehreren Zahlenwerten, die als Value Komma-separiert vorliegen, ein Byte[] machen willst, so musst Du Dich selber darum kümmern!

Eine Möglichkeit hierbei wäre, dass Du das Ganze mit dem ConfigurationManager einliest, die Werte splittest und in byte-Werte konvertierst:

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:
using System.Configuration;
using System.Collections.Specialized;

private static byte[] GetValues()
{
  object config = ConfigurationManager.GetSection("appSettings");
  var values = config as NameValueCollection;
  if (values != null)
  {
    string werte = values["Wert"];
    return Array.ConvertAll<stringbyte>(werte.Split(new char[] { ',' }), 
                                        new Converter<stringbyte>(StringToByteConverter));
  }
  return null;
}

private static byte StringToByteConverter(string value)

  int result;
  if (!int.TryParse(value, out result) || result > byte.MaxValue)
    throw new InvalidCastException(string.Format("Cannot convert \"{0}\" to byte-Value", value));
  return (byte)result;
}

(Für den ConfigurationManager muss eine Referenz auf System.Configuration eingebunden werden)

Aber beachte dabei: wenn mehrer Einträge in der Section mit dem gleichen Namen existieren, dann wird die letzte NameValueCollection genommen. Und wenn mehrere Anwendungskonfigurationsdateien existieren, dann wird die erste genommen.
Meines Erachtens ziemlich unsicher, zumal der Benutzer auch darin rumpfuschen kann. Aber um mögliche Fehlerbehandlung musst Du Dich selber kümmern!

Marko