自定义App.config NameValueSectionHandler的bug修复创建自己的NameValueCollectionSectionHandler
2012-10-18 14:26
441 查看
在很多时候我们需要自定义我们自己的自定义App.config 文件,而微软为我们提供了默认的
System.Configuration.NameValueSectionHandler
System.Configuration.DictionarySectionHandler
System.Configuration.SingleTagSectionHandler
经常用这些也没有出现问题。今天因项目需求的问题再次使用System.Configuration.NameValueSectionHandler,相应的配置如下:
<configSections>
<section name="mySection1" type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
<mySection1>
<add key="filepath" value="Views/Channel/men"></add>
<add key="filepath" value="Views/Channel/homme"></add>
<add key="filepath" value="Views/Channel/fleece/20120906"></add>
<add key="filepath" value="Views/Channel/Designer"></add>
<add key="filepath" value="Views/Channel/coats/20120816"></add>
<add key="filepath" value="Views/Channel/xiuxianku/20120517"></add>
<add key="filepath" value="men"></add>
<add key="filepath" value="homme"></add>
<add key="filepath" value="fleece"></add>
<add key="filepath" value="Designer"></add>
<add key="filepath" value="coats"></add>
<add key="filepath" value="xiuxianku"></add>
</mySection1>
然后在读取相应的配置信息。
NameValueCollection mySection1 = ((NameValueCollection)ConfigurationManager.GetSection("mySection1"));
List<string> fileList = mySection1["filepath"].Split(new char[] { ',' }).ToList();得到的结果只有最后一条,而我们所用的NameValueCollection不一致,让我们来看看源码吧:
= str2;而不是调用add方法。
修改后代码:
public class NameValueCollectionSectionHandler : IConfigurationSectionHandler
{
// Fields
private const string defaultKeyAttribute = "key";
private const string defaultValueAttribute = "value";
// Methods
public object Create(object parent, object context, XmlNode section)
{
return CreateStatic(parent, section, this.KeyAttributeName, this.ValueAttributeName);
}
internal static object CreateStatic(object parent, XmlNode section)
{
return CreateStatic(parent, section, "key", "value");
}
internal static object CreateStatic(object parent, XmlNode section, string keyAttriuteName, string valueAttributeName)
{
NameValueCollection values;
if (parent == null)
{
values = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
}
else
{
NameValueCollection values2 = (NameValueCollection)parent;
values = new NameValueCollection(values2);
}
foreach (XmlNode node in section.ChildNodes)
{
if (node.Name == "add")
{
string key = node.Attributes[keyAttriuteName].Value;
string value = node.Attributes[valueAttributeName].Value;
values.Add(key, value);
}
else if (node.Name == "remove")
{
string key = node.Attributes[keyAttriuteName].Value;
values.Remove(key);
}
else if (node.Name.Equals("clear"))
{
values.Clear();
}
}
return values;
}
// Properties
protected virtual string KeyAttributeName
{
get
{
return "key";
}
}
protected virtual string ValueAttributeName
{
get
{
return "value";
}
}
}
当然这样运行结果就和我们常用的NameValueCollection一样。
System.Configuration.NameValueSectionHandler
System.Configuration.DictionarySectionHandler
System.Configuration.SingleTagSectionHandler
经常用这些也没有出现问题。今天因项目需求的问题再次使用System.Configuration.NameValueSectionHandler,相应的配置如下:
<configSections>
<section name="mySection1" type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
<mySection1>
<add key="filepath" value="Views/Channel/men"></add>
<add key="filepath" value="Views/Channel/homme"></add>
<add key="filepath" value="Views/Channel/fleece/20120906"></add>
<add key="filepath" value="Views/Channel/Designer"></add>
<add key="filepath" value="Views/Channel/coats/20120816"></add>
<add key="filepath" value="Views/Channel/xiuxianku/20120517"></add>
<add key="filepath" value="men"></add>
<add key="filepath" value="homme"></add>
<add key="filepath" value="fleece"></add>
<add key="filepath" value="Designer"></add>
<add key="filepath" value="coats"></add>
<add key="filepath" value="xiuxianku"></add>
</mySection1>
然后在读取相应的配置信息。
NameValueCollection mySection1 = ((NameValueCollection)ConfigurationManager.GetSection("mySection1"));
List<string> fileList = mySection1["filepath"].Split(new char[] { ',' }).ToList();得到的结果只有最后一条,而我们所用的NameValueCollection不一致,让我们来看看源码吧:
internal static object CreateStatic(object parent, XmlNode section, string keyAttriuteName, string valueAttributeName) { ReadOnlyNameValueCollection values; if (parent == null) { values = new ReadOnlyNameValueCollection(StringComparer.OrdinalIgnoreCase); } else { ReadOnlyNameValueCollection values2 = (ReadOnlyNameValueCollection) parent; values = new ReadOnlyNameValueCollection(values2); } HandlerBase.CheckForUnrecognizedAttributes(section); foreach (XmlNode node in section.ChildNodes) { if (!HandlerBase.IsIgnorableAlsoCheckForNonElement(node)) { if (node.Name == "add") { string str = HandlerBase.RemoveRequiredAttribute(node, keyAttriuteName); string str2 = HandlerBase.RemoveRequiredAttribute(node, valueAttributeName, true); HandlerBase.CheckForUnrecognizedAttributes(node); values[str] = str2; } else if (node.Name == "remove") { string name = HandlerBase.RemoveRequiredAttribute(node, keyAttriuteName); HandlerBase.CheckForUnrecognizedAttributes(node); values.Remove(name); } else if (node.Name.Equals("clear")) { HandlerBase.CheckForUnrecognizedAttributes(node); values.Clear(); } else { HandlerBase.ThrowUnrecognizedElement(node); } } } values.SetReadOnly(); return values; }很明显在add的时候它用的是values[str]
= str2;而不是调用add方法。
修改后代码:
public class NameValueCollectionSectionHandler : IConfigurationSectionHandler
{
// Fields
private const string defaultKeyAttribute = "key";
private const string defaultValueAttribute = "value";
// Methods
public object Create(object parent, object context, XmlNode section)
{
return CreateStatic(parent, section, this.KeyAttributeName, this.ValueAttributeName);
}
internal static object CreateStatic(object parent, XmlNode section)
{
return CreateStatic(parent, section, "key", "value");
}
internal static object CreateStatic(object parent, XmlNode section, string keyAttriuteName, string valueAttributeName)
{
NameValueCollection values;
if (parent == null)
{
values = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
}
else
{
NameValueCollection values2 = (NameValueCollection)parent;
values = new NameValueCollection(values2);
}
foreach (XmlNode node in section.ChildNodes)
{
if (node.Name == "add")
{
string key = node.Attributes[keyAttriuteName].Value;
string value = node.Attributes[valueAttributeName].Value;
values.Add(key, value);
}
else if (node.Name == "remove")
{
string key = node.Attributes[keyAttriuteName].Value;
values.Remove(key);
}
else if (node.Name.Equals("clear"))
{
values.Clear();
}
}
return values;
}
// Properties
protected virtual string KeyAttributeName
{
get
{
return "key";
}
}
protected virtual string ValueAttributeName
{
get
{
return "value";
}
}
}
当然这样运行结果就和我们常用的NameValueCollection一样。
相关文章推荐
- 自定义App.config NameValueSectionHandler的bug修复创建自己的NameValueCollectionSectionHandler
- ASP.NET 实践:使用 IConfigurationSectionHandler 创建自定义配置段
- NameValueCollectionValueProvider
- Java编程之TreeSet排序两种解决方法(1)元素自身具备比较功能,元素需要实现Comparable接口覆盖compare(2)创建根据自定义Person类的name进行排序的Comparator
- NameValueCollection
- 修复mac 下 make menuconfig 的bug以及自定义make menuconfig界面
- vs 2010 创建windows phone 程序 出现System.ArgumentNullException Value cannot be null. Parameter name: parentContext
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
- duilib 修复padding属性导致其他控件自动计算宽高度错误的bug和导致自己宽高度错误的bug
- 使用IConfigurationSectionHandler在web.config中增加自定义配置
- Simple NameValueCollection
- [原创]自定义Config例子,使用IConfigurationSectionHandler 接口
- .Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点
- API23org.apache.http.NameValuePair 需要自己写入gradle的关联
- HttpNameValueCollection处理GET POST提交数据类
- cocos2dx3.4 新声音引擎bug,自己修复了---带方法,希望引擎组能看到这博客验证下
- jQuery创建自己的插件(自定义插件)的方法
- .Net——实现IConfigurationSectionHandler接口定义处理程序处理自己定义节点
- 修复fastjson启用WriteClassName时parse原生类型属性错误的bug
- ofbiz修复bug——使用内容组件创建博客文章时报错