5

我创建了一种动态添加SettingsProperty到 .NETapp.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(); 
}

下次运行时,我要求设置属性,但找不到之前创建的任何属性。不管我是否打电话ApplicationEnvironment.GlobalSettings.Reload();

4

2 回答 2

1

用户定义的配置设置与创建它们的程序集版本相关联。如果您有滚动版本号(例如 1.0.. ,您将丢失上次运行的设置。

于 2009-08-30T06:45:29.177 回答
1

我遇到了同样的问题。恕我直言,问题在于 .NETSystem.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只调用一次。在这两种情况下,您都需要知道属性的名称和类型。

于 2012-01-31T13:01:04.017 回答