C# c如何预先验证所有ConfigurationElement属性?

C# c如何预先验证所有ConfigurationElement属性?,c#,.net,app-config,C#,.net,App Config,我有几个从ConfigurationElement派生的自定义配置元素类,一些属性具有验证属性,其他是枚举类型 问题在于可以正确创建配置对象,但只有在访问属性时才会引发异常。在这种情况下,字符串不会解析为任何已知的枚举值 我的问题是,在我继续之前,我是否可以在程序启动时确保app.config文件中的任何自定义部分都没有问题 谢谢,Radek鉴于此示例配置部分包含一个枚举: 对象本身不需要任何验证属性。您可以在应用程序启动时加载每个自定义节并对其进行验证。当您尝试加载它们时,它们会引发异常,或者

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

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

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

谢谢,Radek

鉴于此示例配置部分包含一个枚举:


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

您可以在应用程序启动时加载每个自定义节并对其进行验证。当您尝试加载它们时,它们会引发异常,或者如果它们包含您确定为无效的其他值,则会引发异常。问题是,在您尝试访问自定义节的特定属性之前,现在将引发异常。因此,这并不容易,除非有一个技巧可以以更自动化的方式完成。您可以使用标记自定义配置类并对其进行验证。即使验证不起任何作用,我认为它也会强制访问属性,这反过来会导致异常提前抛出。我尝试使用少数几个可以应用于类ScaffoldTableAttribute的数据注释属性之一标记配置类,但没有,这没有帮助。Still类被读取,但属性只有在访问它们时才被验证。工作得很好!非常感谢:我将整个自定义section对象作为section参数传递,所有属性都会递归验证,包括集合。完美的
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>
private void ValidateSection(object section)
{
    var context = new ValidationContext(section);
    Validator.ValidateObject(section, context);
}