Settings.Default。[PropertyName],Settings.Default.Properties和Settings.Default.PropertyValues有什么区别?

时间:2013-12-17 09:42:11

标签: c# .net wpf settings

我想知道这3个Settings.Default.<PropertyName>Settings.Default.PropertiesSettings.Default.PropertyValues之间的区别。
我有一个wpf窗口,可以根据这些Settings动态生成控件,然后可以更新Settings值 我首先使用了Settings.Default.Properties Collection,但我认为它不会更新配置或用户文件夹中的物理设置文件中的值。 所以我用反射来更新,但我仍然无法想象如何获得 反思的价值观。 (可能还需要对此进行研究)

Settings.Default.GetType().GetProperty(propertyName, 
    typeof(string)).SetValue(source, fileDialog.FileName, null);
Settings.Default.Save();
Settings.Default.Reload();

然后我看到Settings.Default.PropertyValues具有最新的更新值并在调试模式下进行了测试

string properyValue = 
Convert.ToString(Settings.Default.PropertyValues[propertyName].PropertyValue);
奇怪的是,当我创建安装程序和exe时,它们似乎不起作用。仍然要弄清楚究竟是什么错误。 如果我让事情变得复杂并且遗漏了某些东西,有人会指出我吗?

更新1

在nflash的评论之后,我检查了文件的创建时间。应用程序启动所有3时都没有创建文件,我甚至在开始时调用了Settings.Default.Save,但它没有创建文件
Settings.Default.<PropertyName>Settings.Default.Properties被实例化但是Settings.Default.PropertyValues没有。
只有在“设置”和“保存”中进行更改后,才会创建文件。

Update2

现在我提供的解决方案是

source.GetType().GetProperty(setting.Name, typeof(string))
                .SetValue(source, "NewValue", null);

正如nflash所提到的那样,它将是类型安全的(虽然反射有它的直觉)。但Settings.Default.<PropertyName>已正确同步并实例化。

3 个答案:

答案 0 :(得分:1)

只想添加您只能更改“用户”范围的设置。保存设置的新值时,该值不会保存在应用程序路径的配置中,而是保存在%localappdata%文件夹(%localappdata%\ CompanyName \ ApplicationName_someGUID \ AppVersion)中的user.config中

<强>更新 关于上次更新,只有在保存设置的值不同于设置的默认值时才会创建user.config文件。

我不确定您是否仍然对此有疑问,因此我正在尝试添加更多信息:

Settings.Default.<PropertyName>因为wonko79指出的只是相应值的属性访问器。如果您查看设置背后的代码(或只是属性的Go To Definition),您将看到如下内容:

public string PropertyName {
        get {
            return ((string)(this["PropertyName"]));
        }
        set {
            this["PropertyName"] = value;
        }
    }

数组运算符正在访问保存实际上是PropertyValues的值的基础结构。

Properties和PropertyValues之间的区别有点棘手。这些实际上是两个不同的结构(一个是SettingsPropertyCollection,另一个是SettingsPropertyValueCollection)。 Properties属性在ApplicationSettingsBase类中定义,PropertyValues在SettingsBase类中定义。

SettingsProperty类(SettingsPropertyCollection的元素)包含有关设置本身(元数据?)及其默认值的信息。

SettingsPropertyValue类(SettingsPropertyValueCollection的元素)包含设置的实际值和一些其他控制信息,例如值是否为脏,是否使用默认值等。

在一天结束时,这就是.NET内部管理设置的方式,我们需要知道的是如何获取和设置这些设置。

我总是喜欢使用设置设计器生成的属性,因为它是强类型的,并且已经将强制转换为相应的类型。另外使用Properties或PropertyValues需要一个字符串作为参数,并且在输入错误的情况下我只会在运行时遇到错误,而不是在拼写错误的属性名称时得到的编译错误。

答案 1 :(得分:0)

要在更改后保存设置,您必须致电

Settings.Default.Save();

Settings.Default.<PropertyName>是相应设置值的属性访问器。 Settings.Default.Properties是设置文件中所有设置的集合。 Settings.Default.PropertyValues是设置文件中所有设置值的集合。

也许Using Settings in C#是一个很好的阅读起点。

答案 2 :(得分:0)

user1064248提到的文章是不错的信息,但没有解决PropertyValues问题。除了以下实用建议之外,我无法在Rameez和nflash的良好建议中添加任何内容:如果希望强制填充PropertyValues,则只需强制更改值即可。在我的设置中,我有一个名为“ Timestamp”的DateTime属性,如果将其放在表单Load事件中,则会发现nn1为零,并且nn2包含所有属性的计数:

int nn1 = Properties.Settings.Default.PropertyValues.Count;
Properties.Settings.Default.Timestamp = DateTime.UtcNow; // Forces PropertyValues to load
int nn2 = Properties.Settings.Default.PropertyValues.Count;