Как в следующий раз загрузить динамически созданные настройки свойств? - PullRequest
5 голосов
/ 14 октября 2008

Я создал способ динамического добавления SettingsProperty в файл .NET app.config. Все это прекрасно работает, но когда я запускаю свое приложение в следующий раз, я вижу только свойства, созданные в конструкторе. Как я могу загрузить обратно свойства времени выполнения?

Мой код для создания SettingsProperty выглядит следующим образом:

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

При следующем запуске я запрашиваю свойство settings. Я не смог найти ни одного свойства, созданного ранее. Неважно, если я позвоню ApplicationEnvironment.GlobalSettings.Reload(); или нет.

Ответы [ 2 ]

1 голос
/ 31 января 2012

Я сталкивался с той же проблемой. ИМХО проблема в том, что объект .NET System.Configuration.SettingsBase использует отражение для определения имен, типов и т. Д. Свойств, которые должны быть загружены из постоянного хранилища. И когда вы добавляете свойство динамических настроек, эта информация отсутствует. Поэтому вам нужно добавить определение свойства настроек не только перед тем, как сохранить значение, но и перед тем, как прочитать его. В вашем случае это должно быть что-то вроде

...
// 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];

Вы можете сначала вызвать метод CreateProperty для всех свойств, которые вы хотите использовать, а затем вызвать Reload только один раз. В обоих случаях вам нужно знать имена и типы свойств.

1 голос
/ 30 августа 2009

Пользовательские параметры конфигурации привязаны к версии сборки, с которой они были созданы. Если у вас есть скользящий номер версии (например, 1.0. . ), вы потеряете настройки после последнего запуска.

...