zoukankan      html  css  js  c++  java
  • C#自定义ConfigSections节

    在Net2.0以上的版本对自定义configSection是件相对容易的事情.
    比如,我们要创建以下自定义的配置节ConfigSectionsLib
    <configuration>
    <configSections>
    <section name="ConfigSectionsLib" type="ConfigSectionsLib.IPSection,ConfigSectionsLib"/>
    </configSections>
    <ConfigSectionsLib configSource="ConfigFiles\IPAllow.config" />
    ......
    <configuration>

    IPAllow.config文件结构如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <ConfigSectionsLib>
    <IPItemElement>
    <IPItem Name="1" IP="192.168.1.1"></IPItem>
    <IPItem Name="2" IP="192.168.1.2"></IPItem>
    <IPItem Name="3" IP="192.168.1.3"></IPItem>
    <IPItem Name="4" IP="192.168.1.4"></IPItem>
    </IPItemElement>
    </ConfigSectionsLib>

    我们该如何开始呢,
    首先应该建个项目(名称空间为ConfigSectionsLib,  DLL文件名:ConfigSectionsLib.dll)
    创建类:IPSection 让它继承ConfigurationSection
    代码如下:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Configuration;
    using System.ComponentModel;

    namespace ConfigSectionsLib
    {
    public class IPSection : ConfigurationSection
    {
    /// <summary>
    /// Gets the IPItemElement element.
    /// </summary>
    [ConfigurationProperty("IPItemElement")]
    public IPItemElementCollection IPItems
    {
    get { return (IPItemElementCollection)this["IPItemElement"]; }
    }


    }
    }
    这代表我们要创建一个IPItems属性,这个属性是个IPItemElementCollection集合,它的定义在下面:

    [ConfigurationCollection(typeof(IPItemElement), AddItemName = "IPItem", CollectionType = ConfigurationElementCollectionType.BasicMap)]
    public class IPItemElementCollection : ConfigurationElementCollection
    {
    public IPItemElement this[int index]
    {
    get { return (IPItemElement)base.BaseGet(index); }
    set
    {
    if (base.BaseGet(index) != null)
    {
    base.BaseRemoveAt(index);
    }
    base.BaseAdd(index, value);
    }
    }

    public new IPItemElement this[string name]
    {
    get { return (IPItemElement)base.BaseGet(name); }
    }


    protected override ConfigurationElement CreateNewElement()
    {
    return new IPItemElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
    return (element as IPItemElement).Name;
    }

    public override ConfigurationElementCollectionType CollectionType
    {
    get { return ConfigurationElementCollectionType.BasicMap; }
    }

    protected override string ElementName
    {
    get { return "IPItem"; }
    }

    }
    如果想创建跟appSettings和connectionStrings一样的配置节,就是由<add/>子节组成的配置节,
    你可以这样定义IPItemElementCollection
    [ConfigurationCollection(typeof(IPItemElement),  CollectionType = ConfigurationElementCollectionType.AddRemoveClearMap)]
    public class IPItemElementCollection : ConfigurationElementCollection
    {
    public IPItemElement this[int index]
    {
    get { return (IPItemElement)base.BaseGet(index); }
    set
    {
    if (base.BaseGet(index) != null)
    {
    base.BaseRemoveAt(index);
    }
    base.BaseAdd(index, value);
    }
    }

    public new IPItemElement this[string name]
    {
    get { return (IPItemElement)base.BaseGet(name); }
    }


    protected override ConfigurationElement CreateNewElement()
    {
    return new IPItemElement();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
    return (element as IPItemElement).Name;
    }
           // 将下面的注释
    // public override ConfigurationElementCollectionType CollectionType
    // {
    //     get { return ConfigurationElementCollectionType.BasicMap; }
    //  }

    // protected override string ElementName
    // {
    //      get { return "IPItem"; }
    //  }

    }
    这种形式的配置节将以以下的形式出现:
    <ConfigSectionsLib>
    <IPItemElement>
    <Add Name="1" IP="192.168.1.1"></Add>
    <Add Name="2" IP="192.168.1.2"></Add>
    <Add Name="3" IP="192.168.1.3"></Add>
    <Add Name="4" IP="192.168.1.4"></Add>
    </IPItemElement>
    </ConfigSectionsLib>

    剩下的就是IPItemElement的定义:
    public class IPItemElement : ConfigurationElement
    {
    [ConfigurationProperty("Name", DefaultValue = "")]
    public string Name
    {

    get { return this["Name"] as string; }

    }

    [ConfigurationProperty("IP", DefaultValue = "")]
    public string IP
    {
    get { return this["IP"] as string; }

    }
    }

    这样就大功告成了,我们就可以写个类来封装对它的访问:
    public class CustomIP
    {
    private string mName;

    public string Name
    {
    get { return mName; }
    set { mName = value; }
    }
    private string mIP;

    public string IP
    {
    get { return mIP; }
    set { mIP = value; }
    }


    }

    public class SectionSetting
    {
    static IPSection ipSection = ConfigurationManager.GetSection("ConfigSectionsLib") as IPSection;

    public static List<CustomIP> GetCustomIPList()
    {
    List<CustomIP> lst = new List<CustomIP>();
    foreach (IPItemElement item in ipSection.IPItems)
    {
    CustomIP cip = new CustomIP();
    cip.IP = item.IP;
    cip.Name = item.Name;
    lst.Add(cip);
    }
    //这边返回的就是所有子节的集合
    return lst;
    }

    }

  • 相关阅读:
    codeforces #322 div 2 D. Three Logos (枚举)
    hdu 5481||bestcoder #57 div 2 C Desiderium ()
    codeforces #322 div 2 C. Developing Skills(思路)
    codeforces #322 div 2 B. Luxurious Houses (思路)
    codeforces #322 div 2 A. Vasya the Hipster(随便搞)
    [转自codeforces] How to come up with the solutions: techniques
    uva 489
    hdoj 5479 || bestcoder #57 div 2 A Scaena Felix(模拟)
    hdu 5480|| bestcoder   #57 div 2 Conturbatio(前缀和||树状数组)
    支付宝和内购的区别以及集成方法
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/3111753.html
Copyright © 2011-2022 走看看