2010-11-25 6 views
0

J'ai ajouté une section personnalisée à mon fichier app.config pour une application Windows Forms. J'ai créé la classe d'étendre le fichier de configuration:Problème avec les paramètres de configuration personnalisés

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

je précise le nom de la section:

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

Maintenant, voici où je pense que la question est. Le ci-dessus a bien fonctionné avant, mais je besoin de beaucoup de propriétés pour cette section et au lieu de le faire:

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

Je fais ceci:

<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; 
      } 
     } 
} 
} 

Ce qui ne fonctionne pas. Apparemment, il ne comprend pas la syntaxe 'propriété'.

Des idées de ce que je fais mal? Merci.

+0

Pourriez-vous s'il vous plaît poster le code pour la méthode LoadValuesFromXml? Je pense que votre problème peut être dans la façon dont vous récupérez les valeurs du XmlNode qui contient les informations de votre section personnalisée. –

+0

J'étends les paramètres de configuration. Va ajouter ce code. – Damien

Répondre

1

Si définirait les propriétés que vous avez besoin de cette façon:

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

que chaque « propriété » devient nœud enfant pour CustomFields et vos propriétés sont des attributs maintenant/valeurs pour les nœuds enfants, pas les attributs des CustomFields nœud comme dans le premier exemple.

Si vous avez beaucoup de propriétés et que vous voulez les mettre ici sont plus élégamment deux options qui pourraient envisager:

1) Utilisez la structure suivante pour la section personnalisée (légèrement modifiée):

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

et le code suivant pour définir les propriétés utilisées pour récupérer les valeurs:

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 poule, pour récupérer les valeurs:

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

Pour plus de détails, voir s'il vous plaît How to: Create Custom Configuration Sections Using ConfigurationSection sur MSDN.

2) Adoptez une approche programmatique au lieu de vous fier aux attributs et à la réflexion. ConfigurationSection class ou IConfigurationSectionHandler pourrait être utilisé dans ce cas. En conséquence, vous aurez accès à partir du code au nœud xml contenant les données de section personnalisées et pourrez charger n'importe quel type de structure XML.

+0

À la votre! C'est ce que je cherchais. – Damien

+0

Vous êtes les bienvenus :) –

Questions connexes