• 自定义App.config NameValueSectionHandler的bug修复创建自己的NameValueCollectionSectionHandler


    在很多时候我们需要自定义我们自己的自定义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不一致,让我们来看看源码吧:

    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一样。

  • 相关阅读:
    基本排序算法
    Ubuntu下fcitx安装。(ibus不会用)
    sublime搭建Java编译平台及编码问题
    Centos6.5(final)安装gcc和g++,python以及导致问题的解决方法
    如何查询centos查看系统内核版本,系统版本,32位还是64位
    vim插件之SnipMate
    Linux rename命令
    Hadoop安装(Ubuntu Kylin 14.04)
    vim 文字插入
    Checkbox indeterminate属性
  • 原文地址:https://www.cnblogs.com/majiang/p/2729461.html
Copyright © 2020-2023  润新知