【问题标题】:.NET Settings File Available Types.NET 设置文件可用类型
【发布时间】:2010-07-29 17:32:13
【问题描述】:

在修改 .NET 设置文件时,我可以选择设置的类型。但是,即使在“浏览”窗口中,也不是我的项目可访问的所有类型都出现。

什么决定了一个类型是否可以用于设置文件设置?

我创建了一个类型,我希望能够保存它,我想知道我需要对其进行哪些更改才能在设置文件中使用它。

(VS 2008 - .Net 3.5)

【问题讨论】:

  • 任何可以被 XML 序列化的东西都是可用的(即任何有默认构造函数的东西)。即使那些它没有显示在浏览中,您也可以在文本框中输入完整的类型名称以添加该类型的设置。

标签: .net settings type-systems settings.settings


【解决方案1】:

您需要做的是稍微“破解” .settings 和 .Designer.cs 文件,如 here 所记录的那样。

如果您在项目中创建自定义类型,例如:

namespace MyApp
{
    public struct MyType
    {
        public string StringValue;
    }
}

要让它在设置编辑器中显示为一个选项,您需要将使用该类型的第一个设置值添加到文件中,如下所示:

SettingsFile.settings:

<Setting Name="SettingNameGoesHere" Type="MyApp.MyType" Scope="User">
  <Value Profile="(Default)" />
</Setting>

SettingsFile.Designer.cs

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public global::MyApp.MyType SettingNameGoesHere {
    get {
        return ((global::MyApp.MyType)(this["SettingNameGoesHere"]));
    }
    set {
        this["SettingNameGoesHere"] = value;
    }
}

【讨论】:

  • 废话!一些“自制”类型出现在常规设计器中 - 没有进行这种黑客攻击。只是不是我想要的那个。为什么那些在没有黑客攻击的情况下出现?
  • 认为它不会选择同一个程序集/项目中的类型。即,您引用的 other 程序集中的任何类型都将可用
  • 附注“布莱赫!”不是针对你,只是我对在设计器代码中乱搞感到不舒服。
  • @Mashmagar,我猜到了 - 手动破解文件的想法对我也没有多大作用 =)
【解决方案2】:

“浏览”窗口中出现什么类型 - 我相信答案是可序列化类型。下面是一个对我有用的示例(VS 2012,.Net 4.0)。

具有公共可序列化成员的类:

class Person {
    public string Name;
    public int Age;
}

在设计器中设置值要写什么:

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Name>John</Name>
    <Age>42</Age>
</Person>

【讨论】:

  • 取决于您认为“可序列化”的内容。您的示例在Person 类上没有SerializableAttribute,但它仍然可以在设置中使用。例如尽管typeof(Person).IsSerializablefalse,它仍然可以在设置中使用。
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 2014-05-03
  • 2015-03-10
  • 2017-03-02
  • 2014-03-06
  • 2020-12-10
  • 2020-04-23
  • 2018-07-01
相关资源
最近更新 更多