C# - ConfigurationSection isRequired属性

ebb*_*ebb 9 c# configuration config

我有这个奇怪的问题...在我的代码中我是否将IsRequired的值设置为false或true然后它保持为false ..但是如果我输入DefaultValue它有效吗?

非工作代码是:

public class FtpSettingsSection : ConfigurationSection
{
    [ConfigurationProperty("host", IsRequired = true)]
    public HostElement Host
    {
        get { return (HostElement)this["host"]; }
        set { this["host"] = value; }
    }

}

public class HostElement : ConfigurationElement
{
    [ConfigurationProperty("URL", IsRequired = true)]
    public string URL
    {
        get { return (string)this["URL"]; }
        set { this["URL"] = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

而工作代码是:

public class FtpSettingsSection : ConfigurationSection
{
    [ConfigurationProperty("host", DefaultValue = "", IsRequired = true)]
    public HostElement Host
    {
        get { return (HostElement)this["host"]; }
        set { this["host"] = value; }
    }

}

public class HostElement : ConfigurationElement
{
    [ConfigurationProperty("URL", DefaultValue = "", IsRequired = true)]
    public string URL
    {
        get { return (string)this["URL"]; }
        set { this["URL"] = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我需要将DefaultValue设置为""?

Yog*_*ogh 6

我遇到了同样的问题,并在此处找到了解决方案http://msdn.microsoft.com/en-us/library/system.configuration.configurationpropertyattribute%28v=vs.90%29.aspx#1.评论ConfigurationPropertyAttribute不完全正确,但它解释了问题的基础:

当应用于子对象(派生自)时,该IsRequired成员ConfigurationPropertyAttribute不起作用ConfigurationElement.当子系统反映父节/元素的属性以确定定义了哪些配置属性时,它将为每个子元素创建一个新的实例(适当类型)并将其存储在父节点的值列表中.稍后,当它验证是否已指定所有必需属性时,它无法区分默认初始化子元素和配置文件中显式包含的子元素.

最理想的解决方法是以编程方式通过ConfigurationProperty类声明所需的元素.这需要比声明方法更多的工作.替代...

据我所知,替代方案是不正确的.

可以在ConfigurationProperty页面上找到编程模型的示例.我已经设法通过在我的自定义元素的构造函数中声明我需要的属性并将其他所有内容保持不变来为自己解决问题.

我怀疑你在添加时它实际上并没有工作DefaultValue,而是因为其他原因而抛出异常.你将不得不深入到InnerException链的末尾找到ConfigurationErrorsException.缺少必需属性时的正确消息是"找不到必需属性'主机'.(C:\ path\to\yourproject\bin\Debug\yourproject.vshost.exe.Config line ##)"

当您提供空字符串默认值时,配置子系统将尝试将该字符串解析为a HostElement和fail.结果ConfigurationErrorsException有消息"无法解析属性'host'的默认值.错误是:对象引用未设置为对象的实例.(C:\ path\to\yourproject\bin\Debug\yourproject. vshost.exe.Config line ##)"


dex*_*ter 0

我假设您的配置中没有序列化 URL 属性的值。因此,当加载配置时,ConfigurationManager 检查属性以查看是否需要该属性值,如果找不到值,则抛出异常。如果设置了默认值,则在配置中找不到该值时将使用该值。