C 读取自定义的config

本文主要介绍了C#中如何读写自定义的XML配置文件,而不是默认的app.config或web.config。通过创建自定义的ConfigurationSection、ConfigurationElement和ConfigurationElementCollection,可以方便地管理和访问配置数据。文章还提到了配置节点的定义、集合的创建以及读取配置值的方法,并强调了在定义section的type属性时应注意的命名空间和DLL匹配问题,避免加载类型错误导致的运行时错误。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

今天说下C#读写自定义config文件的各种方法。由于这类文章已经很多,但是大多数人举例子都是默认的在app.confg或者web.config进行读写,而不是一般的XML文件,我主要写的是一般的Xml文件,不是默认路径下的app.config.

 

通常,我们在.NET开发过程中,会接触二种类型的配置文件:config文件,xml文件。今天我主要演示如何创建自己的自定义的配置节点,而不是介绍如何使用appSetting.

 

首先来看下配置节点。

 

 

 
  
 1 <?xml version="1.0" ?>  2 <configuration>  3 <configSections>  4 <section name="MySection1" type="ConfigApplicationDemo.MySection1, ConfigApplication" />  5 <section name="MySection2" type="ConfigApplicationDemo.MySection2, ConfigApplication" />  6 <section name="MySection3" type="ConfigApplicationDemo.MySection3, ConfigApplication" />  7 <section name="MySection4" type="ConfigApplicationDemo.MySection4, ConfigApplication" /> 8  </configSections>  9 <MySection1 name="Halia" url="http://www.cnblogs.com/halia/">10 </MySection1> 11 <MySection2> 12 <users username="halia" password="test2012"></users> </MySection2> 13 <MySection3> 14 <add key="aa" value="11111"></add>15  <add key="bb" value="22222"></add>16  <add key="cc" value="33333"></add> 17 </MySection3> 18 <MySection4> 19  <add name="aa" id="11111" role="test"></add>20  <add name="bb" id="22222" role="key"></add>21  <add name="cc" id="33333" role="rest"></add> 22 </MySection4> 23  </configuration>
 
 

 

 

 

 

这里大家可以看到我定义了四种不同的section,其中前两种介绍的人很多,这里不多赘述,先看看第三种。

 

 

 
  
<MySection3> <add key="aa" value="11111"></add><add key="bb" value="22222"></add><add key="cc" value="33333"></add> </MySection3> 
 
 

这个配置具有一系列数据,这时候就要用到collection,代码如下:

 
  
public class MySection3 : ConfigurationSection    // 所有配置节点都要选择这个基类{    
private static readonly ConfigurationProperty s_property        = new ConfigurationProperty(string.Empty, typeof(TheKeyValueCollection), null,                                         ConfigurationPropertyOptions.IsDefaultCollection);        [ConfigurationProperty("", Options = ConfigurationPropertyOptions.IsDefaultCollection)]    public TheKeyValueCollection KeyValues  
   {       
      get        {          
      return (TheKeyValueCollection)base[s_property];      
     }   }


[ConfigurationCollection(typeof(TheKeyValue))]
public class TheKeyValueCollection: ConfigurationElementCollection        // 自定义一个集合{       new public TheKeyValuethis[string name]   
  {        get        {          
      return (TheKeyValue)base.BaseGet(name);   
      } 
   }    // 下面二个方法中抽象类中必须要实现的。    protected override ConfigurationElement CreateNewElement()   
  {       
    return new TheKeyValue();  
  }    protected override object GetElementKey
  (
    ConfigurationElement element)   
  {        return ((TheKeyValue)element).Key;  
  } 
}   


public class TheKeyValue : ConfigurationElement    // 集合中的每个元素{   
  [ConfigurationProperty("key", IsRequired = true)]   
  public string Key   
  {        get { return this["key"].ToString(); }        set { this["key"] = value; }   
  }
    [ConfigurationProperty("value", IsRequired = true)]   
  public string Value    {       
    get { return this["value"].ToString(); }        set { this["value"] = value; }    }
  }
}
 
 

上面的三个class做了三件事:
1. 为每个集合中的参数项创建一个从ConfigurationElement继承的派生类。
2. 为集合创建一个从ConfigurationElementCollection继承的集合类,具体在实现时主要就是调用基类的方法。
3. 在创建ConfigurationSection的继承类时,创建一个表示集合的属性就可以了,注意[ConfigurationProperty]的各参数。

 

然后就是读取config中的值,在读取自定节点时,我们需要调用ConfigurationManager.GetSection()得到配置节点,并转换成我们定义的配置节点类,然后就可以按照强类型的方式来访问了。

 
  
                if (!string.IsNullOrEmpty(ConfigFile))//这里的ConfigFile是你要读取的Xml文件的路径,如果为空,则使用默认的app.config文件
                {                    var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = ConfigFile };                    var config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);                   MySection3 configSection = (MySection3 )config.GetSection("MySection3");                }                else                {                    //Get the default config app.config                    MySection3  configSection = (MySection3 )ConfigurationManager.GetSection("MySection3");                }

             var values = from kv in configSection.KeyValues.Cast<TheKeyValue>()
                         select new
            { key=kv.Key, val=kv.Value)};
 
 

 我们在来看下section4的配置:

 
  
<MySection4> <add name="aa" id="11111" role="test"></add><add name="bb" id="22222" role="key"></add><add name="cc" id="33333" role="rest"></add> </MySection4> 
 
 

这个关于Collection的写法和第三个差不多,不同之处在于属性的定义是不同的。

 
  
public class TheKeyValue : ConfigurationElement    // 集合中的每个元素{      [ConfigurationProperty("name", IsRequired = true)]      public string Name  {        get { return this["name"].ToString(); }        set { this["name"] = value; }      }    [ConfigurationProperty("id", IsRequired = true)]      public string Id    {            get { return this["id"].ToString(); }        set { this["id"] = value; }    }  }    [ConfigurationProperty("role", IsRequired = true)]      public string Role    {            get { return this["role"].ToString(); }        set { this["role"] = value; }    }  }}
 
 

然后是获取相应的值:

 
  
 if (!string.IsNullOrEmpty(ConfigFile))//这里的ConfigFile是你要读取的Xml文件的路径,如果为空,则使用默认的app.config文件                {                    var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = ConfigFile };                    var config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);                   MySection4 configSection = (MySection4 )config.GetSection("MySection4");                }                else                {                    //Get the default config app.config                    MySection4  configSection = (MySection4 )ConfigurationManager.GetSection("MySection4");                }             var values = from v in configSection.KeyValues.Cast<TheKeyValue>()                         select new            { name=v.Name, id=v.Id,role=v.Role)};
 
 

上面就是关于自定义section的一些分享,这里还要说一下section里面的type
<section name="MySection1" type="ConfigApplicationDemo.MySection1, ConfigApplication" />

 

关于这个type的定义,逗号前面ConfigApplicationDemo.MySection1, 需要对应你的namespace和你的section类的名字,逗号后面需要对应的是你编译出来的dll的名字,很多情况下namespace和dll名字是一样的,但是出现不一样的情况一定要注意,不然type定义不好,或版本不对,会报错,错误如下,程序会告诉你找不到指定的file或者section。

 

An error occurred creating the configuration section handler for XXX: Could not load type..

 

 

 

 

 

 

 

 


<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值