在 ConfigurationElementCollection 中使用 <remove /> 时无法识别属性 'name'

Unrecognized attribute 'name' when using <remove /> in a ConfigurationElementCollection

我有一个自定义 ConfigurationSection,其中包含一个带有自定义 ConfigurationElement 实例的自定义 ConfigurationElementCollection<add><clear> 标记在配置文件中工作正常,但在我的单元测试期间使用 <remove> 会生成以下异常:

System.Configuration.ConfigurationErrorsException: 无法识别的属性 'name'。请注意,属性名称区分大小写。

配置文件非常简单。这是有问题的测试部分的内部部分:

<exceptionHandling>
  <policies>
    <clear />
    <add name="default" shouldLog="true" shouldShow="true"/>
    <add name="initialization" shouldLog="true" shouldShow="true"/>
    <add name="security" shouldLog="true" shouldShow="true"/>
    <add name="logOnly" shouldLog="true" shouldShow="false"/>
    <add name="unhandled" shouldLog="true" shouldShow="true"/>
    <add name="test" shouldLog="false" shouldShow="false"/>
    <remove name="test"/>
  </policies>
</exceptionHandling>

以下是配置的相关代码类(为简洁省略了部分代码)

public sealed class ExceptionHandlingSection : ConfigurationSection
{
    [ConfigurationProperty("policies", IsDefaultCollection = false)]
    [ConfigurationCollection(typeof(PolicyElementCollection), AddItemName = "add", RemoveItemName = "remove", ClearItemsName = "clear")]
    public PolicyElementCollection Policies => (PolicyElementCollection)base["policies"];
}

public sealed class PolicyElementCollection : ConfigurationElementCollection
{
   // pretty boiler plate
}

public sealed class PolicyElement : ConfigurationElement
{
    [ConfigurationProperty("name", IsRequired = true)]
    public string Name
    {
        get => (string)this["name"];
        set => this["name"] = value;
    }

    // other properties
}

需要做什么才能使 <remove> 像测试配置文件中所示那样工作?

这个问题的答案其实很简单。

我读了一些关于 XML 属性的文章,但从根本上说它是在寻找键 属性。这可以由 ConfigurationPropertyAttribute 的 属性 分配。要使 <remove> 标签起作用,我需要做的就是如下更改 ConfigurationElement class:

public sealed class PolicyElement : ConfigurationElement
{
    [ConfigurationProperty("name", IsKey = true, IsRequired = true)]
    public string Name
    {
        get => (string)this["name"];
        set => this["name"] = value;
    }

    // other properties
}