修改自定义配置节子元素值
本文关键字:元素 自定义 配置 修改 | 更新日期: 2023-09-27 18:18:56
我正在尝试删除一些旧的遗留引用,我现在正在做一些我以前从未尝试过的事情。假设我有一个这样的配置文件部分:
<customSection>
<customValues>
<custom key="foo" invert="True">
<value>100</value>
</custom>
<custom key="bar" invert="False">
<value>200</value>
</custom>
</customValues>
</customSection>
我现在已经创建了ConfigurationSection、ConfigurationElement和ConfigurationElementCollection类来正确读取所有这些内容。这里它们是供参考的(除了ValueElement类,它覆盖了Deserialize方法来获取元素的值):
public class CustomSection : ConfigurationSection
{
[ConfigurationProperty("customValues")]
[ConfigurationCollection(typeof(CustomValueCollection), AddItemName = "custom")]
public CustomValueCollection CustomValues
{
get { return (CustomValueCollection)this["customValues"]; }
}
}
public class CustomValueCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new CustomElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((CustomElement) element).Key;
}
public CustomElement this[int index]
{
get { return (CustomElement) BaseGet(index); }
}
new public CustomElement this[string key]
{
get { return (CustomElement) BaseGet(key); }
}
public bool ContainsKey(string key)
{
var keys = new List<object>(BaseGetAllKeys());
return keys.Contains(key);
}
}
public class CustomElement : ConfigurationElement
{
[ConfigurationProperty("key", IsRequired = true)]
public string Key
{
get { return (string)this["key"]; }
}
[ConfigurationProperty("invert", IsRequired = true)]
public bool Invert
{
get { return (bool)this["invert"]; }
}
[ConfigurationProperty("value", IsRequired = true)]
public ValueElement Value
{
get { return (ValueElement)this["value"]; }
}
}
public class ValueElement : ConfigurationElement
{
private int value;
//used to get value of element, not of an attribute
protected override void DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey)
{
value = (int)reader.ReadElementContentAs(typeof(int), null);
}
public int Value
{
get { return value; }
}
}
我现在坚持的是这个业务需求:如果CustomElement的反转值为true,那么在关联的ValueElement中反转value属性的值。所以如果我访问foo下value的值,我将得到-100。
有没有人知道如何将这样的东西传递给ValueElement对象或使ValueElement意识到它的父CustomElement能够获得那个Invert属性?我最初的想法是在CustomElement类的Value属性getter中进行检查,如果Invert为true,则修改那里的ValueElement对象,但我愿意接受其他想法。
这里的目标是在不触及配置文件的情况下删除遗留代码,否则我会将"value"子元素作为属性推入父元素。
谢谢
从表面上看,您只需要修改Value
属性getter以包含您的反向逻辑。我看不出有什么理由不行。
您可以添加另一个属性来获取原始值。
[ConfigurationProperty("value", IsRequired = true)]
public int Value
{
get
{
var result = (ValueElement)this["value"];
return Invert ? result.Value * -1 : result.Value;
}
}