【问题标题】:c# how to validate all ConfigurationElement properties upfront?c# 如何预先验证所有 ConfigurationElement 属性?
【发布时间】:2017-11-02 01:32:03
【问题描述】:

我有几个自定义配置元素(从 ConfigurationElement 派生的类),一些属性具有验证属性,其他是枚举类型。

问题是可以正确创建配置对象,但只有在访问属性时才会抛出异常。 (在这种情况下,字符串不会解析为任何已知的枚举值)。

我的问题是,在我继续之前,我能否在程序启动时确保 app.config 文件中的任何自定义部分都没有问题?

谢谢,拉德克

【问题讨论】:

  • 您可以在应用程序启动时加载每个自定义部分并对其进行验证。当您尝试加载它们时,它们会抛出异常,或者如果它们包含您确定无效的其他值。
  • 问题是现在会抛出异常,直到您尝试访问自定义部分的特定属性。所以这并不容易,除非有一个技巧可以以更自动化的方式完成。
  • 您可以使用data annotations 标记自定义配置类并验证它们。即使验证没有做任何事情,我认为它会强制访问属性,这反过来会导致您的异常提前抛出。
  • 我尝试使用极少数可应用于类的数据注释属性之一标记配置类(ScaffoldTableAttribute),但没有,它没有帮助。仍然读取类,但仅在访问它们时验证属性。

标签: c# .net app-config


【解决方案1】:

鉴于此示例 ConfigurationSection 包含一个 enum

public class MyConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty(name: "myProperty")]
    public TestEnum MyProperty => 
        (TestEnum) Enum.Parse(typeof(TestEnum), Convert.ToString(base["myProperty"]));
}

public enum TestEnum
{
    A = 1, B = 2
}

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="myConfigurationSection" 
             type="ValidatedConfigurationSection.MyConfigurationSection,
                   ValidatedConfigurationSection"/>
  </configSections>

  <myConfigurationSection myProperty="NoSuchValueInEnum"/>
</configuration>

如果enum 值无效,这将引发异常(需要System.ComponentModel.DataAnnotations。)

private void ValidateSection(object section)
{
    var context = new ValidationContext(section);
    Validator.ValidateObject(section, context);
}

对象本身不需要验证属性。

【讨论】:

  • 效果很好!非常感谢 :) 我将整个自定义部分对象作为“部分”参数传递,并且所有属性都经过递归验证,包括集合。完美!
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多