设置之间有什么区别.默认.[属性名称] 、设置.默认.属性和设置.默认.属性值

  • 本文关键字:默认 设置 属性 之间 区别 c# .net wpf settings
  • 更新时间 :
  • 英文 :


我想知道这3 Settings.Default.<PropertyName>Settings.Default.PropertiesSettings.Default.PropertyValues之间的区别。
我有一个 wpf 窗口,可以根据这些Settings动态生成控件,然后可以更新Settings值我第一次使用Settings.Default.Properties集合,但我相信它不会更新用户文件夹中的配置或物理设置文件中的值。于是我用反射来更新,但还是想不通如何获取反射值 .(可能还需要对此进行研究)

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没有。
只有当我在"设置和保存"中进行更改时,才会创建该文件。

更新2

现在我带来的解决方案是

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

正如nflash所提到的,它将是类型安全的(尽管反射有它的缺点)。但是Settings.Default.<PropertyName>因此会正确同步和实例化。

只想补充一点,您只能更改具有"用户"范围的设置。当您保存设置的新值时,该值不会保存在应用程序路径的配置中,而是保存在 user.config 中的 %localappdata% 文件夹 (%localappdata%\CompanyName\ApplicationName_someGUID\AppVersion) 内

更新:关于上次更新,仅当您保存的值与设置的默认值不同的设置时,才会创建 user.config 文件。

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

正如 wonko79 指出的那样,Settings.Default.<PropertyName>只是相应值的属性访问器。如果您查看设置背后的代码(或只是转到属性的定义),您将看到如下所示的内容:

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

数组运算符正在访问保存值的基础结构,这些值实际上是属性值。

属性

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

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

类(SettingsPropertyValueCollection 的元素)包含设置的实际值和一些附加控件信息,例如值是否脏、是否使用默认值等。

归根结底,这就是 .NET 在内部管理设置的全部方式,我们需要知道的只是如何获取和设置这些设置。

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

要在更改设置后保存设置

,您必须调用
Settings.Default.Save();

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

也许在 C# 中使用设置是一个很好的阅读起点。

user1064248 提到的文章是很好的信息,但没有解决属性值问题。除了这个务实的建议之外,我不能对Rameez和nflash的好建议添加任何东西:如果你想强制填充PropertyValues,你只需要强制一个值改变。在我的设置中,我有一个名为"时间戳"的 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;

相关内容

  • 没有找到相关文章