方法1: 

System.Collections.Specialized.NameValueCollection nvc = (System.Collections.Specialized.NameValueCollection) 
System.Configuration.ConfigurationManager.GetSection(sectionName); 

string keyValue = nvc.GetValues(keyName)[0].ToString(); 

方法2: 

System.Web.Configuration.WebConfigurationManager.AppSettings[keyName].ToString();

参考下面的文章

在C#中如何读取配置文件 
1. 配置文件概述: 
应 用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是 configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大 概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。 
常见配置文件模式: 

<configuration> 
<configSections> //配置节声明区域,包含配置节和命名空间声明 
<section> //配置节声明 
  <sectionGroup> //定义配置节组 
   <section> //配置节组中的配置节声明 
<appSettings> //预定义配置节 
<Custom element for configuration section> //配置节设置区域 

2. 只有appSettings节的配置文件及访问方法 
下面是一个最常见的应用程序配置文件的例子,只有appSettings节。 

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<appSettings> 
<add key="connectionstring" value="User ID=sa;Data Source=.;Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" /> 
<add key="TemplatePATH" value="Template" /> 
</appSettings> 
</configuration> 

下面来看看这样的配置文件如何方法。 
string _connectionString=ConfigurationSettings.AppSettings["connectionstring"]; 
使用ConfigurationSettings类的静态属性AppSettings就可以直接方法配置文件中的配置信息。这个属性的类型是NameValueCollection。 

3. 自定义配置文件 
3.1 自定义配置节 
一个用户自定义的配置节,在配置文件中分为两部分:一是在<configSections></ configSections>配置节中声明配置节(上面配置文件模式中的“<section>”),另外是在< configSections></ configSections >之后设置配置节(上面配置文件模式中的“<Custom element for configuration section>”),有点类似一个变量先声明,后使用一样。声明一个配置文件的语句如下: 
<section name=" " type=" "/> 
<section>:声明新配置节,即可创建新配置节。 
name:自定义配置节的名称。 
type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、 System.Configuration.DictionarySectionHandler、 System.Configuration.NameValueSectionHandler。 
不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type。 

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/> 
<section name="Test2" type="System.Configuration.DictionarySectionHandler"/> 
<section name="Test3" type="System.Configuration.NameValueSectionHandler" /> 
</configSections> 
<Test1 setting1="Hello" setting2="World"/> 
<Test2> 
<add key="Hello" value="World" /> 
</Test2> 
<Test3> 
<add key="Hello" value="World" /> 
</Test3> 
</configuration> 

我们对上面的自定义配置节进行说明。在声明部分使用<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>声明了一个配置节它的名字叫 Test1,类型为SingleTagSectionHandler。在设置配置节部分使用 <Test1 setting1="Hello" setting2="World"/>设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配 置节和这个类似。 
下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。 
public static object GetConfig(string sectionName); 
下面是访问这三个配置节的代码: 

//访问配置节Test1 
IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig("Test1"); 
string str = (string)IDTest1["setting1"] +" "+(string)IDTest1["setting2"]; 
MessageBox.Show(str); //输出Hello World 
//访问配置节Test1的方法2 
string[] values1=new string[IDTest1.Count]; 
IDTest1.Values.CopyTo(values1,0); 
MessageBox.Show(values1[0]+" "+values1[1]); //输出Hello World 
//访问配置节Test2 
IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig("Test2"); 
string[] keys=new string[IDTest2.Keys.Count]; 
string[] values=new string[IDTest2.Keys.Count]; 
IDTest2.Keys.CopyTo(keys,0); 
IDTest2.Values.CopyTo(values,0); 
MessageBox.Show(keys[0]+" "+values[0]); 
//访问配置节Test3 
NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3"); 
MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]); //输出Hello World 

通过上面的代码我们可以看出,不同的type通过GetConfig返回的类型不同,具体获得配置内容的方式也不一样。 配置节处理程序 
返回类型 

SingleTagSectionHandler 
Systems.Collections.IDictionary 
DictionarySectionHandler 
Systems.Collections.IDictionary 
NameValueSectionHandler 
Systems.Collections.Specialized.NameValueCollection 

3.2 自定义配置节组 
配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明 部分将创建配置节的包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于< sectionGroup>元素中。下面是一个包含配置节组的配置文件的例子: 

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
<sectionGroup name="TestGroup"> 
<section name="Test" type="System.Configuration.NameValueSectionHandler"/> 
</sectionGroup> 
</configSections> 
<TestGroup> 
<Test> 
<add key="Hello" value="World"/> 
</Test> 
</TestGroup> 
</configuration> 

下面是访问这个配置节组的代码: 
NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test"); 
MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]); //输出Hello World 
C# 解析配置文件内容 System.Configuration 
1. 创建配置节类 
必须创建继承自ConfigurationSection的对象才能进行配置数据读写操作,ConfigurationSection提供了索引器用来获取和设置配置数据,需要注意的是拥有ConfigurationProperty特性的属性才会被存储,并且名称要保持大小写完全一致,如下面的代码中,所有的"id"必须保持一样。 

class ConfigSectionData : ConfigurationSection 

[ConfigurationProperty("id")] 
public int Id 

get { return (int)this["id"]; } 
set { this["id"] = value; } 

[ConfigurationProperty("time")] 
public DateTime Time 

get { return (DateTime)this["time"]; } 
set { this["time"] = value; } 

2. 创建配置文件操作对象 

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
ConfigSectionData data = new ConfigSectionData(); 
data.Id = 1000; 
data.Time = DateTime.Now; 
config.Sections.Add("add", data); 
config.Save(ConfigurationSaveMode.Minimal); 

上面的例子是操作 app.config,在根节点(configuration)下写入名称为"add"的配置数据。 

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
<section name="add" type="ConsoleApplication1.ConfigSectionData, ... /> 
</configSections> 
<add id="1000" time="02/18/2006 21:51:06" /> 
</configuration> 

需要注意的 VS2005 在IDE模式下会将信息写入 *.vshost.exe.config,并且在程序关闭时覆写该文件,因此您可能看不到您写入的配置数据,只要在资源管理其中执行 *.exe 文件,您就可以在 *.exe.config 文件中看到结果了。 
如果我们需要操作非缺省配置文件,可以使用ExeConfigurationFileMap对象。 

ExeConfigurationFileMap file = new ExeConfigurationFileMap(); 
file.ExeConfigFilename = "test.config"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None); 
ConfigSectionData data = new ConfigSectionData(); 
data.Id = 1000; 
data.Time = DateTime.Now; 
config.Sections.Add("add", data); 
config.Save(ConfigurationSaveMode.Minimal); 

如果我们不希望在根节点下写入配置数据,可以使用ConfigurationSectionGroup对象。 

ExeConfigurationFileMap file = new ExeConfigurationFileMap(); 
file.ExeConfigFilename = "test.config"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None); 
ConfigSectionData data = new ConfigSectionData(); 
data.Id = 1000; 
data.Time = DateTime.Now; 
config.SectionGroups.Add("group1", new ConfigurationSectionGroup()); 
config.SectionGroups["group1"].Sections.Add("add", data); 
config.Save(ConfigurationSaveMode.Minimal); 

下面就是生成的配置文件。 

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<configSections> 
<sectionGroup name="group1" type="System.Configuration.ConfigurationSectionGroup, ... > 
<section name="add" type="ConsoleApplication1.ConfigSectionData, ... /> 
</sectionGroup> 
</configSections> 
<group1> 
<add id="1000" time="02/18/2006 22:01:02" /> 
</group1> 
</configuration> 

3. 读取配置文件 

ExeConfigurationFileMap file = new ExeConfigurationFileMap(); 
file.ExeConfigFilename = "test.config"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None); 
ConfigSectionData data = config.SectionGroups["group1"].Sections["add"] as ConfigSectionData; 
//ConfigSectionData data = config.Sections["add"] as ConfigSectionData; // 从根节读取 
if (data != null) 

Console.WriteLine(data.Id); 
Console.WriteLine(data.Time); 

4. 写配置文件 
在写入 ConfigurationSectionGroup 和 ConfigurationSection 前要判断同名配置是否已经存在,否则会写入失败。 
另外如果配置文件被其他Configuration对象修改,则保存会失败,并抛出异常。建议采用Singleton模式。

ExeConfigurationFileMap file = new ExeConfigurationFileMap(); 
file.ExeConfigFilename = "test.config"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None); 
ConfigSectionData data = new ConfigSectionData(); 
data.Id = 2000; 
data.Time = DateTime.Now; 
ConfigurationSectionGroup group1 = config.SectionGroups["group1"]; 
if (group1 == null) 
config.SectionGroups.Add("group1", new ConfigurationSectionGroup()); 
ConfigurationSection data = group1.Sections["add"] as config; 
if (add == null) 
config.SectionGroups["group1"].Sections.Add("add", data); 
else 

group1.Sections.Remove("add"); 
group1.Sections.Add("add", data); 
// 或者直接修改原配置对象,前提是类型转换要成功。 
//ConfigSectionData configData = add as ConfigSectionData; 
//configData.Id = data.Id; 
//configData.Time = data.Time; 

config.Save(ConfigurationSaveMode.Minimal); 

5. 删除配置节 

删除ConfigurationSectionGroup 
config.SectionGroups.Remove("group1"); 
//config.SectionGroups.Clear(); 
config.Save(ConfigurationSaveMode.Minimal); 
删除ConfigurationSection 
config.Sections.Remove("add1"); 
//config.Sections.Clear(); 
if (config.SectionGroups["group1"] != null) 

config.SectionGroups["group1"].Sections.Remove("add2"); 
//config.SectionGroups["group1"].Sections.Clear(); 

config.Save(ConfigurationSaveMode.Minimal); 

 

6. 其他 
可以使用 ConfigurationManager.OpenMachineConfiguration() 来操作 Machine.config 文件。 
或者使用 System.Web.Configuration 名字空间中的 WebConfigurationManager 类来操作 ASP.net 配置文件。 
ConfigurationManager还提供了AppSettings、ConnectionStrings、GetSection()等便捷操作。 
7. 使用自定义类 
可以使用自定义类,不过需要定义一个转换器。 

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Globalization; 
using System.ComponentModel; 
// 要写入配置文件的自定义类 
class CustomData 

public CustomData(string s) 

this.s = s; 

private string s; 
public string S 

get { return s; } 
set { s = value; } 


// 自定义的转换器(演示代码省略了类型判断) 
class CustomConvert : ConfigurationConverterBase 

public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type) 

return (type == typeof(string)); 

public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type) 

return (value as CustomData).S; 

public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data) 

return new CustomData((string)data);; 


class ConfigSectionData : ConfigurationSection 

[ConfigurationProperty("id")] 
public int Id 

get { return (int)this["id"]; } 
set { this["id"] = value; } 

[ConfigurationProperty("time")] 
public DateTime Time 

get { return (DateTime)this["time"]; } 
set { this["time"] = value; } 

[ConfigurationProperty("custom")] 
[TypeConverter(typeof(CustomConvert))] // 指定转换器 
public CustomData Custom 

get { return (CustomData)this["custom"]; } 
set { this["custom"] = value; } 


public class Program 

static void Main(string[] args) 

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
ConfigSectionData data = new ConfigSectionData(); 
data.Id = 1000; 
data.Time = DateTime.Now; 
data.Custom = new CustomData("abcdefg..."); 
config.Sections.Add("add", data); 
config.Save(ConfigurationSaveMode.Minimal); 
// 读取测试 
ConfigSectionData configData = (ConfigSectionData)config.Sections["add"]; 
Console.WriteLine(configData.Custom.S); 

 保存后的配置文件 

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
<section name="add" type="..." /> 
</configSections> 
<add id="1000" time="04/17/2006 22:06:58" custom="abcdefg..." /> 
</configuration>