2010-11-25 11 views
0

Ich habe einen benutzerdefinierten Abschnitt zu meiner app.config-Datei für eine Windows Forms-Anwendung hinzugefügt. Ich habe die Klasse, um die Konfigurationsdatei zu verlängern:Problem mit benutzerdefinierten Konfigurationseinstellungen

CustomFields myCustomFields = (CustomFields)System.Configuration.ConfigurationManager.GetSection("CustomFields"); 

ich die Abschnittsnamen angeben:

<section name="CustomFields" type="Application.Core.CustomFields, ATMCardRequest.Core" allowLocation="true" allowDefinition="Everywhere" /> 

Hier ist, wo ich denke, das Problem ist. Das Obige hat funktioniert gut vor, aber ich brauche eine Menge von Eigenschaften für diesen Abschnitt und statt dies zu tun:

<CustomFields setting1='hello' setting2='world'/> 

Ich tue dies:

<CustomFields> 
<property name="setting1">hello</property> 
<property name="setting2">world</property> 
... 
</CustomFields> 

Code:

/// <summary> 
    /// Settings file which holds the name of the XML Fields 
    /// </summary> 
    public class setting1: ConfigurationSection 
    { 

     /// <summary> 
     /// Name of the setting1 Field 
     /// </summary> 
     [ConfigurationProperty("setting1", IsRequired = true)] 
     public String setting1 
     { 
      get 
      { 
       return (String)this["setting1"]; 
      } 
      set 
      { 
       this["setting1"] = value; 
      } 
     } 

     /// <summary> 
     /// Name of the setting2 Field 
     /// </summary> 
     [ConfigurationProperty("setting2",IsRequired = true)] 
     public String setting2 
     { 
      get 
      { 
       return (String)this["setting2"]; 
      } 
      set 
      { 
       this["setting2"] = value; 
      } 
     } 
} 
} 

Was nicht funktioniert. Anscheinend versteht es die 'Eigenschaft'-Syntax nicht.

Irgendwelche Ideen, was ich falsch mache? Vielen Dank.

+0

Könnten Sie bitte den Code für die LoadValuesFromXml-Methode veröffentlichen? Ich denke, dass Ihr Problem möglicherweise darin besteht, dass Sie die Werte aus dem XmlNode abrufen, der die Informationen aus Ihrem benutzerdefinierten Abschnitt enthält. –

+0

Ich erweitere die Konfigurationseinstellungen. Wird diesen Code hinzufügen. – Damien

Antwort

1

Wenn würde die Eigenschaften definieren, die Sie auf diese Weise brauchen:

<CustomFields> 
    <property name="setting1">hello</property> 
    <property name="setting2">world</property> 
    ... 
</CustomFields> 

als jede „Eigenschaft“ wird untergeordneten Knoten für Custom und Ihre Eigenschaften werden nun Attribute/Werte für die untergeordneten Knoten, nicht Attribute der Custom Knoten wie im ersten Beispiel.

Wenn Sie viele Eigenschaften haben, und Sie wollen, dass sie mehr elegant hier setzen sind zwei Optionen, die sich anschauen sollten:

1) Verwenden Sie die folgende Struktur für den benutzerdefinierten Bereich (leicht verändert):

<CustomFields> 
    <setting1 value="hello"/> 
    <setting2 value="world"/> 
    ... 
</CustomFields> 

und der folgende Code, um die Eigenschaften zu definieren, verwendet, um die Werte zu erhalten:

public class CustomFields: ConfigurationSection 
{    
    [ConfigurationProperty("setting1")] 
    public PropertyElement Setting1 
    { 
     get 
     { 
      return (PropertyElement)this["setting1"]; 
     } 
     set 
      { this["setting1"] = value; } 
    } 

    [ConfigurationProperty("setting2")] 
    public PropertyElement Setting2 
    { 
     get 
     { 
      return (PropertyElement)this["setting2"]; 
     } 
     set 
      { this["setting2"] = value; } 
    } 
} 
public class PropertyElement : ConfigurationElement 
{ 
    [ConfigurationProperty("value", IsRequired = false)] 
    public String Value 
    { 
     get 
     { 
      return (String)this["value"]; 
     } 
     set 
     { 
      this["value"] = value; 
     } 
    } 
} 

T hen, um die Werte abzurufen:

string setting1value = myCustomFields.Setting1.Value; 
string setting2value = myCustomFields.Setting2.Value; 

Details siehe How to: Create Custom Configuration Sections Using ConfigurationSection auf MSDN.

2) Nehmen Sie einen programmatischen Ansatz, anstatt sich auf Attribute und Reflexion zu verlassen. ConfigurationSection class oder IConfigurationSectionHandler könnte in diesem Fall verwendet werden. Als Ergebnis haben Sie Zugriff vom Code auf den XML-Knoten, der die benutzerdefinierten Abschnittsdaten enthält, und können beliebige Arten von XML-Strukturen laden.

+0

Prost! Genau das habe ich gesucht. – Damien

+0

Gern geschehen :) –