我想知道这3个Settings.Default.<PropertyName>
,Settings.Default.Properties
和Settings.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>
已正确同步并实例化。
答案 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;