在 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
}
我有一个自定义 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
}