2008-10-14 8 views
5

J'ai créé un moyen d'ajouter dynamiquement SettingsProperty à un fichier .NET app.config. Tout fonctionne bien, mais quand je lance mon application la prochaine fois que je peux seulement voir les propriétés qui sont créées dans le concepteur. Comment puis-je recharger l'exécution des propriétés?Comment recharger une propriété créée dynamiquement la prochaine fois?

Mon code pour créer le SettingsProperty se présente comme suit:

internal void CreateProperty<T>(string propertyName) 
{ 
    string providerName = "LocalFileSettingsProvider"; 
    System.Configuration.SettingsAttributeDictionary attributes = new SettingsAttributeDictionary(); 
    System.Configuration.UserScopedSettingAttribute attr = new UserScopedSettingAttribute(); 

    attributes.Add(attr.TypeId, attr); 

    System.Configuration.SettingsProperty prop; 
    SettingsProvider provider = ApplicationEnvironment.GlobalSettings.Providers[providerName]; 

    prop = new System.Configuration.SettingsProperty(
     propertyName, 
     typeof(T), 
     provider, 
     false, 
     default(T), 
     System.Configuration.SettingsSerializeAs.String, 
     attributes, 
     false, 
     false 
    ); 

    ApplicationEnvironment.GlobalSettings.Properties.Add(prop); 
    ApplicationEnvironment.GlobalSettings.Reload(); 
} 

Lorsque la prochaine exécution je demande la propriété des paramètres je ne pouvais pas trouver des propriétés créées previosuly. Peu importe si j'appelle le ApplicationEnvironment.GlobalSettings.Reload(); ou non.

Répondre

1

Les paramètres de configuration définis par l'utilisateur sont liés à la version de l'ensemble avec laquelle ils ont été créés. Si vous avez un numéro de version mobile (1.0 , par exemple), vous perdrez les paramètres de la dernière exécution.

1

Je suis tombé sur le même problème. À mon humble avis le problème est que l'objet .NET System.Configuration.SettingsBase utilise la réflexion pour déterminer les noms, les types, etc. des propriétés qui devraient être chargées à partir du stockage persistant. Et lorsque vous ajoutez une propriété de paramètres dynamiques, cette information est manquante. Donc, vous aurez besoin d'ajouter la définition de la propriété de paramètres non seulement avant enregistrer la valeur, mais aussi avant de lire il. Dans votre cas, il devrait être quelque chose comme ça

... 
// the name and type of the property being read must be known at this point 
CreateProperty<T>(propertyName); 
ApplicationEnvironment.GlobalSettings.Reload(); 
T propertyValue = ApplicationEnvironment.GlobalSettings[propertyName]; 

Vous pouvez appeler la méthode CreateProperty au début pour toutes les propriétés que vous souhaitez utiliser et ensuite appeler Reload juste une fois. Dans les deux cas, vous devrez connaître les noms et les types des propriétés.