【问题标题】:What is the difference between Settings.Default.[PropertyName] , Settings.Default.Properties and Settings.Default.PropertyValues?Settings.Default.[PropertyName] 、 Settings.Default.Properties 和 Settings.Default.PropertyValues 有什么区别?
【发布时间】:2013-12-17 09:42:11
【问题描述】:

我想知道这 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 没有。
只有在设置和保存中进行更改后,才会创建文件。

更新2

现在我提出的解决方案是

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

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

【问题讨论】:

  • 请注意,无论出于何种原因,在您从 Settings 对象检索属性值之前,不会填充 PropertyValues 集合。您检索哪个属性并不重要......您只需要获取一个,以强制类填充值。见stackoverflow.com/questions/89149/…

标签: c# .net wpf settings


【解决方案1】:

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

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

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

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

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 需要一个字符串作为参数,如果出现拼写错误,我只会在运行时收到错误,而不是在拼写错误的属性名称时出现编译错误。

【讨论】:

  • 它在用户范围内,会更新我观察到的一些发现。
  • 如果有人能了解更多信息,我会暂时保留这个问题,再提一下PropertiesPropertyValuesApplicationSettingsBase 中实现,SettingsBase 是抽象类.
  • 其实ApplicationSettingsBase中的PropertyValues只是返回base.PropertyValues,而PropertyValues的实际实现是在SettingsBase中实现的。
  • 正确..感谢那个......奇怪的实现,该成员应该被覆盖并再次调用基类,并在基类中分配抽象 SettingsBase 类的构造函数。也许你可以补充一点,因为 Properties 实现直接在抽象类中,它的值在我们调用时就可用,但 PropertyValues 的实现依赖于 ApplicationSettingsBase 的派生类,我还没有弄清楚。
【解决方案2】:

要在更改设置后保存设置,您必须调用

Settings.Default.Save();

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

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

【讨论】:

    【解决方案3】:

    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;
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      相关资源
      最近更新 更多