首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ConfigurationValidator要验证ConfigurationProperty的默认值,即使IsRequired是真的?

为什么ConfigurationValidator要验证ConfigurationProperty的默认值,即使IsRequired是真的?
EN

Stack Overflow用户
提问于 2010-09-19 07:57:43
回答 4查看 4K关注 0票数 13

假设我有一个配置属性,如下所示。请注意,没有默认值。

代码语言:javascript
复制
[ConfigurationProperty("x", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
    get { return (string)this["x"]; }
    set { this["x"] = value; }
}

现在,我将我的部分添加如下:

代码语言:javascript
复制
<mySection x="123" />

我会得到这个错误:

属性'x‘的值无效。错误是:字符串必须至少有一个字符长。

如果我将configuration属性更改为包含这样的默认设置,它就可以工作:

代码语言:javascript
复制
[ConfigurationProperty("x", DefaultValue="abc", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
    get { return (string)this["x"]; }
    set { this["x"] = value; }
}

这意味着即使IsRequired是真的,验证器也会验证默认值。这也意味着,我必须在所有属性上包含一个虚拟默认值,才能通过验证,即使它们实际上不会被使用。

这是一个糟糕的设计,还是有一个合理的理由,这种行为?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-19 08:48:46

我以前也有过这个问题。这是有道理的,但我记不起细节了。

我不记得这是否有效,但是您可以尝试在构造函数中声明属性,其中null是默认值。

代码语言:javascript
复制
public class CustomConfigurationSection : ConfigurationSection
{
    public CustomConfigurationSection()
    {
        Properties.Add(new ConfigurationProperty(
            "x",
            typeof(string),
            null,
            null,
            new StringValidator(1),
            ConfigurationPropertyOptions.IsRequired));
    }


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

这与使用默认值和验证器有关,但也是需要默认值的地方。http://msdn.microsoft.com/en-us/library/system.configuration.configurationproperty(VS.85).aspx#1

编辑

我刚刚试用了前面的代码,它就像我预期的那样做了。我之前的代码没有编译,因为我遗漏了一个构造函数属性,所以我已经修复了它。

票数 7
EN

Stack Overflow用户

发布于 2012-02-05 14:06:48

原因是可以在代码中更新配置节类,而不需要配置文件。可以使用默认构造函数,而不为属性指定任何值。在这种情况下,即使您指定了IsRequired=true,也不会引发任何异常。换句话说,只有当属性被从XML反序列化时,IsRequired才会应用。

但是,DefaultValue在这种情况下确实适用,就像当属性从XML反序列化时一样(与任何ConfigurationValidatorAttribute一样)。

如果在单元测试中使用配置部分,这是有意义的。A)在构造节时有一个声明性默认值,B)对默认值进行验证。

票数 3
EN

Stack Overflow用户

发布于 2010-09-19 12:00:02

根据我的理解,这种行为是非常必要的。

由于配置是任何应用程序的核心区域之一,并且假设没有为应用程序关键属性提供任何值,那么整个应用程序可能会导致一些不必要的行为(可能是崩溃、无限期资源利用等)。我认为这就是原因,大多数.Net内置配置属性(如会话超时等)都被设置为默认值,即使用户没有指定值,也会应用这些属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3744953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档