c# – Custom ConfigurationSection:使用空字符串调用CallbackValidator

我正在编写自定义配置部分,我想使用回调验证配置属性,如下例所示:

using System;
using System.Configuration;

class CustomSection : ConfigurationSection {

    [ConfigurationProperty("stringValue", IsRequired = false)]
    [CallbackValidator(Type = typeof(CustomSection), CallbackMethodName = "ValidateString")]
    public string StringValue {
        get { return (string)this["stringValue"]; }
        set { this["stringValue"] = value; }
    }

    public static void ValidateString(object value) {
        if (string.IsNullOrEmpty((string)value)) {
            throw new ArgumentException("string must not be empty.");
        }
    }
}

class Program {
    static void Main(string[] args) {
        CustomSection cfg = (CustomSection)ConfigurationManager.GetSection("customSection");
        Console.WriteLine(cfg.StringValue);
    }
}

我的App.config文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="customSection" type="CustomSection, config-section"/>
  </configSections>
  <customSection stringValue="lorem ipsum"/>
</configuration>

我的问题是,当调用ValidateString函数时,value参数始终是一个空字符串,因此验证失败.如果我只删除验证器,则将字符串值正确初始化为配置文件中的值.

我错过了什么?

编辑我发现实际上验证函数被调用了两次:第一次使用属性的默认值,如果没有指定则为空字符串,第二次使用从配置文件中读取的实际值.有没有办法修改这种行为?

最佳答案 我有同样的问题(除了我创建一个自定义验证器而不是使用CallbackValidator) – 验证器被调用两次,第一次调用传递默认值,第二次调用传递配置值.由于空字符串不是我的某个属性的有效值,因此即使配置了字符串值,也会导致配置错误.

所以我只是更改了验证器以返回一个空字符串,而不是验证它.然后,您可以使用IsRequired属性来控制未提供值时发生的情况.

点赞