读写配置文件
.net Framework 2.0 专门提供了配置文件的操作。 
namespace System.Configuration;
1. 创建配置节类
必须创建继承自ConfigurationSection的对象才能进行配置数据读写操作,ConfigurationSection提供了索引器用来获取和设置配置数据,需要注意的是拥有ConfigurationProperty特性的属性才会被存储,并且名称要保持大小写完全一致,如下面的代码中,所有的"id"必须保持一样。
 class ConfigSectionData : ConfigurationSection
class ConfigSectionData : ConfigurationSection
 {
{
 [ConfigurationProperty("id")]
    [ConfigurationProperty("id")]
 public int Id
    public int Id
 {
    {
 get { return (int) this["id"]; }
        get { return (int) this["id"]; }
 set { this["id"] = value; }
        set { this["id"] = value; }
 }
    }

 [ConfigurationProperty("time")]
    [ConfigurationProperty("time")]
 public DateTime Time
    public DateTime Time
 {
    {
 get { return (DateTime) this["time"]; }
        get { return (DateTime) this["time"]; }
 set { this["time"] = value; }
        set { this["time"] = value; }
 }
    }
 }
}
2. 创建配置文件操作对象
 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData();
 data.Id = 1000;
data.Id = 1000;
 data.Time = DateTime.Now;
data.Time = DateTime.Now;

 config.Sections.Add("add", data);
config.Sections.Add("add", data);
 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);
上面的例子是操作 app.config,在根节点(configuration)下写入名称为"add"的配置数据。
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
 <configuration>
<configuration>
 <configSections>
  <configSections>
 <section name="add" type="ConsoleApplication1.ConfigSectionData,
    <section name="add" type="ConsoleApplication1.ConfigSectionData,  />
 />
 </configSections>
  </configSections>
 <add id="1000" time="02/18/2006 21:51:06" />
  <add id="1000" time="02/18/2006 21:51:06" />
 </configuration>
</configuration>
需要注意的 VS2005 在IDE模式下会将信息写入 *.vshost.exe.config,并且在程序关闭时覆写该文件,因此您可能看不到您写入的配置数据,只要在资源管理其中执行 *.exe 文件,您就可以在 *.exe.config 文件中看到结果了。
如果我们需要操作非缺省配置文件,可以使用ExeConfigurationFileMap对象。
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap();
 file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config";
 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);

 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData();
 data.Id = 1000;
data.Id = 1000;
 data.Time = DateTime.Now;
data.Time = DateTime.Now;

 config.Sections.Add("add", data);
config.Sections.Add("add", data);
 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);
如果我们不希望在根节点下写入配置数据,可以使用ConfigurationSectionGroup对象。
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap();
 file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config";
 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);

 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData();
 data.Id = 1000;
data.Id = 1000;
 data.Time = DateTime.Now;
data.Time = DateTime.Now;

 config.SectionGroups.Add("group1", new ConfigurationSectionGroup());
config.SectionGroups.Add("group1", new ConfigurationSectionGroup());
 config.SectionGroups["group1"].Sections.Add("add", data);
config.SectionGroups["group1"].Sections.Add("add", data);

 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);
下面就是生成的配置文件。
 <?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
 <configuration>
<configuration>
 <configSections>
  <configSections>
 <sectionGroup name="group1" type="System.Configuration.ConfigurationSectionGroup,
    <sectionGroup name="group1" type="System.Configuration.ConfigurationSectionGroup,  >
 >
 <section name="add" type="ConsoleApplication1.ConfigSectionData,
      <section name="add" type="ConsoleApplication1.ConfigSectionData,  />
 />
 </sectionGroup>
    </sectionGroup>
 </configSections>
  </configSections>
 <group1>
  <group1>
 <add id="1000" time="02/18/2006 22:01:02" />
    <add id="1000" time="02/18/2006 22:01:02" />
 </group1>
  </group1>
 </configuration>
</configuration>
3. 读取配置文件
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap();
 file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config";
 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);

 ConfigSectionData data = config.SectionGroups["group1"].Sections["add"] as ConfigSectionData;
ConfigSectionData data = config.SectionGroups["group1"].Sections["add"] as ConfigSectionData;
 //ConfigSectionData data = config.Sections["add"] as ConfigSectionData; // 从根节读取
//ConfigSectionData data = config.Sections["add"] as ConfigSectionData; // 从根节读取

 if (data != null)
if (data != null)
 {
{
 Console.WriteLine(data.Id);
    Console.WriteLine(data.Id);
 Console.WriteLine(data.Time);
    Console.WriteLine(data.Time);
 }
}
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap();
 file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config";
 Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);

 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData();
 data.Id = 2000;
data.Id = 2000;
 data.Time = DateTime.Now;
data.Time = DateTime.Now;

 ConfigurationSectionGroup group1 = config.SectionGroups["group1"];
ConfigurationSectionGroup group1 = config.SectionGroups["group1"];
 if (group1 == null)
if (group1 == null)
 config.SectionGroups.Add("group1", new ConfigurationSectionGroup());
    config.SectionGroups.Add("group1", new ConfigurationSectionGroup());

 ConfigurationSection data = group1.Sections["add"] as config;
ConfigurationSection data = group1.Sections["add"] as config;
 if (add == null)
if (add == null)
 config.SectionGroups["group1"].Sections.Add("add", data);
    config.SectionGroups["group1"].Sections.Add("add", data);
 else
else
 {
{
 group1.Sections.Remove("add");
    group1.Sections.Remove("add");
 group1.Sections.Add("add", data);
    group1.Sections.Add("add", data);

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

 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);
 config.SectionGroups.Remove("group1");
config.SectionGroups.Remove("group1");
 //config.SectionGroups.Clear();
//config.SectionGroups.Clear();

 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);
 config.Sections.Remove("add1");
config.Sections.Remove("add1");
 //config.Sections.Clear();
//config.Sections.Clear();

 if (config.SectionGroups["group1"] != null)
if (config.SectionGroups["group1"] != null)
 {
{
 config.SectionGroups["group1"].Sections.Remove("add2");
    config.SectionGroups["group1"].Sections.Remove("add2");
 //config.SectionGroups["group1"].Sections.Clear();
    //config.SectionGroups["group1"].Sections.Clear();
 }
}

 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);
 using System;
using System;
 using System.Collections;
using System.Collections;
 using System.Collections.Generic;
using System.Collections.Generic;
 using System.Configuration;
using System.Configuration;
 using System.Globalization;
using System.Globalization;
 using System.ComponentModel;
using System.ComponentModel;

 // 要写入配置文件的自定义类
// 要写入配置文件的自定义类
 class CustomData
class CustomData
 {
{
 public CustomData(string s)
    public CustomData(string s)
 {
    {
 this.s = s;
        this.s = s;
 }
    }

 private string s;
    private string s;
 public string S
    public string S
 {
    {
 get { return s; }
        get { return s; }
 set { s = value; }
        set { s = value; }
 }
    }
 }
}

 // 自定义的转换器(演示代码省略了类型判断)
// 自定义的转换器(演示代码省略了类型判断)
 class CustomConvert : ConfigurationConverterBase
class CustomConvert : ConfigurationConverterBase
 {
{
 public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type)
    public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type)
 {
    {
 return (type == typeof(string));
        return (type == typeof(string));
 }
    }

 public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type)
    public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type)
 {
    {
 return (value as CustomData).S;
        return (value as CustomData).S;
 }
    }

 public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)
    public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)
 {
    {
 return new CustomData((string) data);
        return new CustomData((string) data);
 ;
        ;
 }
    }
 }
}

 class ConfigSectionData : ConfigurationSection
class ConfigSectionData : ConfigurationSection
 {
{
 [ConfigurationProperty("id")]
    [ConfigurationProperty("id")]
 public int Id
    public int Id
 {
    {
 get { return (int) this["id"]; }
        get { return (int) this["id"]; }
 set { this["id"] = value; }
        set { this["id"] = value; }
 }
    }

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

 [ConfigurationProperty("custom")]
    [ConfigurationProperty("custom")]
 [TypeConverter(typeof(CustomConvert))] // 指定转换器
    [TypeConverter(typeof(CustomConvert))] // 指定转换器
 public CustomData Custom
    public CustomData Custom
 {
    {
 get { return (CustomData) this["custom"]; }
        get { return (CustomData) this["custom"]; }
 set { this["custom"] = value; }
        set { this["custom"] = value; }
 }
    }
 }
}

 public class Program
public class Program
 {
{
 static void Main(string[] args)
    static void Main(string[] args)
 {
    {
 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

 ConfigSectionData data = new ConfigSectionData();
        ConfigSectionData data = new ConfigSectionData();
 data.Id = 1000;
        data.Id = 1000;
 data.Time = DateTime.Now;
        data.Time = DateTime.Now;
 data.Custom = new CustomData("abcdefg
        data.Custom = new CustomData("abcdefg ");
");

 config.Sections.Add("add", data);
        config.Sections.Add("add", data);
 config.Save(ConfigurationSaveMode.Minimal);
        config.Save(ConfigurationSaveMode.Minimal);

 // 读取测试
        // 读取测试
 ConfigSectionData configData = (ConfigSectionData) config.Sections["add"];
        ConfigSectionData configData = (ConfigSectionData) config.Sections["add"];
 Console.WriteLine(configData.Custom.S);
        Console.WriteLine(configData.Custom.S);
 }
    }
 }
}
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
 <configuration>
<configuration>
 <configSections>
  <configSections>
 <section name="add" type="
    <section name="add" type=" " />
" />
 </configSections>
  </configSections>
 <add id="1000" time="04/17/2006 22:06:58" custom="abcdefg
  <add id="1000" time="04/17/2006 22:06:58" custom="abcdefg " />
" />
 </configuration>
</configuration>
namespace System.Configuration;
1. 创建配置节类
必须创建继承自ConfigurationSection的对象才能进行配置数据读写操作,ConfigurationSection提供了索引器用来获取和设置配置数据,需要注意的是拥有ConfigurationProperty特性的属性才会被存储,并且名称要保持大小写完全一致,如下面的代码中,所有的"id"必须保持一样。
 class ConfigSectionData : ConfigurationSection
class ConfigSectionData : ConfigurationSection {
{ [ConfigurationProperty("id")]
    [ConfigurationProperty("id")] public int Id
    public int Id {
    { get { return (int) this["id"]; }
        get { return (int) this["id"]; } set { this["id"] = value; }
        set { this["id"] = value; } }
    }
 [ConfigurationProperty("time")]
    [ConfigurationProperty("time")] public DateTime Time
    public DateTime Time {
    { get { return (DateTime) this["time"]; }
        get { return (DateTime) this["time"]; } set { this["time"] = value; }
        set { this["time"] = value; } }
    } }
}2. 创建配置文件操作对象
 Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData(); data.Id = 1000;
data.Id = 1000; data.Time = DateTime.Now;
data.Time = DateTime.Now;
 config.Sections.Add("add", data);
config.Sections.Add("add", data); config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);上面的例子是操作 app.config,在根节点(configuration)下写入名称为"add"的配置数据。
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?> <configuration>
<configuration> <configSections>
  <configSections> <section name="add" type="ConsoleApplication1.ConfigSectionData,
    <section name="add" type="ConsoleApplication1.ConfigSectionData,  />
 /> </configSections>
  </configSections> <add id="1000" time="02/18/2006 21:51:06" />
  <add id="1000" time="02/18/2006 21:51:06" /> </configuration>
</configuration>需要注意的 VS2005 在IDE模式下会将信息写入 *.vshost.exe.config,并且在程序关闭时覆写该文件,因此您可能看不到您写入的配置数据,只要在资源管理其中执行 *.exe 文件,您就可以在 *.exe.config 文件中看到结果了。
如果我们需要操作非缺省配置文件,可以使用ExeConfigurationFileMap对象。
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap(); file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config"; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData(); data.Id = 1000;
data.Id = 1000; data.Time = DateTime.Now;
data.Time = DateTime.Now;
 config.Sections.Add("add", data);
config.Sections.Add("add", data); config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);如果我们不希望在根节点下写入配置数据,可以使用ConfigurationSectionGroup对象。
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap(); file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config"; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData(); data.Id = 1000;
data.Id = 1000; data.Time = DateTime.Now;
data.Time = DateTime.Now;
 config.SectionGroups.Add("group1", new ConfigurationSectionGroup());
config.SectionGroups.Add("group1", new ConfigurationSectionGroup()); config.SectionGroups["group1"].Sections.Add("add", data);
config.SectionGroups["group1"].Sections.Add("add", data);
 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);下面就是生成的配置文件。
 <?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?> <configuration>
<configuration> <configSections>
  <configSections> <sectionGroup name="group1" type="System.Configuration.ConfigurationSectionGroup,
    <sectionGroup name="group1" type="System.Configuration.ConfigurationSectionGroup,  >
 > <section name="add" type="ConsoleApplication1.ConfigSectionData,
      <section name="add" type="ConsoleApplication1.ConfigSectionData,  />
 /> </sectionGroup>
    </sectionGroup> </configSections>
  </configSections> <group1>
  <group1> <add id="1000" time="02/18/2006 22:01:02" />
    <add id="1000" time="02/18/2006 22:01:02" /> </group1>
  </group1> </configuration>
</configuration>3. 读取配置文件
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap(); file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config"; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
 ConfigSectionData data = config.SectionGroups["group1"].Sections["add"] as ConfigSectionData;
ConfigSectionData data = config.SectionGroups["group1"].Sections["add"] as ConfigSectionData; //ConfigSectionData data = config.Sections["add"] as ConfigSectionData; // 从根节读取
//ConfigSectionData data = config.Sections["add"] as ConfigSectionData; // 从根节读取
 if (data != null)
if (data != null) {
{ Console.WriteLine(data.Id);
    Console.WriteLine(data.Id); Console.WriteLine(data.Time);
    Console.WriteLine(data.Time); }
}
4. 写配置文件 
在写入 ConfigurationSectionGroup 和 ConfigurationSection 前要判断同名配置是否已经存在,否则会写入失败。 
另外如果配置文件被其他Configuration对象修改,则保存会失败,并抛出异常。建议采用Singleton模式。
 ExeConfigurationFileMap file = new ExeConfigurationFileMap();
ExeConfigurationFileMap file = new ExeConfigurationFileMap(); file.ExeConfigFilename = "test.config";
file.ExeConfigFilename = "test.config"; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
 ConfigSectionData data = new ConfigSectionData();
ConfigSectionData data = new ConfigSectionData(); data.Id = 2000;
data.Id = 2000; data.Time = DateTime.Now;
data.Time = DateTime.Now;
 ConfigurationSectionGroup group1 = config.SectionGroups["group1"];
ConfigurationSectionGroup group1 = config.SectionGroups["group1"]; if (group1 == null)
if (group1 == null) config.SectionGroups.Add("group1", new ConfigurationSectionGroup());
    config.SectionGroups.Add("group1", new ConfigurationSectionGroup());
 ConfigurationSection data = group1.Sections["add"] as config;
ConfigurationSection data = group1.Sections["add"] as config; if (add == null)
if (add == null) config.SectionGroups["group1"].Sections.Add("add", data);
    config.SectionGroups["group1"].Sections.Add("add", data); else
else {
{ group1.Sections.Remove("add");
    group1.Sections.Remove("add"); group1.Sections.Add("add", data);
    group1.Sections.Add("add", data);
 // 或者直接修改原配置对象,前提是类型转换要成功。
    // 或者直接修改原配置对象,前提是类型转换要成功。 //ConfigSectionData configData = add as ConfigSectionData;
    //ConfigSectionData configData = add as ConfigSectionData; //configData.Id = data.Id;
    //configData.Id = data.Id; //configData.Time = data.Time;
    //configData.Time = data.Time; }
}
 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);5. 删除配置节 
删除ConfigurationSectionGroup 
 config.SectionGroups.Remove("group1");
config.SectionGroups.Remove("group1"); //config.SectionGroups.Clear();
//config.SectionGroups.Clear();
 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal); config.Sections.Remove("add1");
config.Sections.Remove("add1"); //config.Sections.Clear();
//config.Sections.Clear();
 if (config.SectionGroups["group1"] != null)
if (config.SectionGroups["group1"] != null) {
{ config.SectionGroups["group1"].Sections.Remove("add2");
    config.SectionGroups["group1"].Sections.Remove("add2"); //config.SectionGroups["group1"].Sections.Clear();
    //config.SectionGroups["group1"].Sections.Clear(); }
}
 config.Save(ConfigurationSaveMode.Minimal);
config.Save(ConfigurationSaveMode.Minimal);6. 其他 
可以使用 ConfigurationManager.OpenMachineConfiguration() 来操作 Machine.config 文件。 
或者使用 System.Web.Configuration 名字空间中的 WebConfigurationManager 类来操作 ASP.net 配置文件。 
ConfigurationManager还提供了AppSettings、ConnectionStrings、GetSection()等便捷操作。 
7. 使用自定义类  
2006-4-17 补充,回复 ggy 网友的疑问。 
引用至 ggy 
比如ConfigSectionData里面 
除了简单类型之外,可不可以有自定义的类 
可以使用自定义类,不过需要定义一个转换器。 
 using System;
using System; using System.Collections;
using System.Collections; using System.Collections.Generic;
using System.Collections.Generic; using System.Configuration;
using System.Configuration; using System.Globalization;
using System.Globalization; using System.ComponentModel;
using System.ComponentModel;
 // 要写入配置文件的自定义类
// 要写入配置文件的自定义类 class CustomData
class CustomData {
{ public CustomData(string s)
    public CustomData(string s) {
    { this.s = s;
        this.s = s; }
    }
 private string s;
    private string s; public string S
    public string S {
    { get { return s; }
        get { return s; } set { s = value; }
        set { s = value; } }
    } }
}
 // 自定义的转换器(演示代码省略了类型判断)
// 自定义的转换器(演示代码省略了类型判断) class CustomConvert : ConfigurationConverterBase
class CustomConvert : ConfigurationConverterBase {
{ public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type)
    public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type) {
    { return (type == typeof(string));
        return (type == typeof(string)); }
    }
 public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type)
    public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type) {
    { return (value as CustomData).S;
        return (value as CustomData).S; }
    }
 public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)
    public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data) {
    { return new CustomData((string) data);
        return new CustomData((string) data); ;
        ; }
    } }
}
 class ConfigSectionData : ConfigurationSection
class ConfigSectionData : ConfigurationSection {
{ [ConfigurationProperty("id")]
    [ConfigurationProperty("id")] public int Id
    public int Id {
    { get { return (int) this["id"]; }
        get { return (int) this["id"]; } set { this["id"] = value; }
        set { this["id"] = value; } }
    }
 [ConfigurationProperty("time")]
    [ConfigurationProperty("time")] public DateTime Time
    public DateTime Time {
    { get { return (DateTime) this["time"]; }
        get { return (DateTime) this["time"]; } set { this["time"] = value; }
        set { this["time"] = value; } }
    }
 [ConfigurationProperty("custom")]
    [ConfigurationProperty("custom")] [TypeConverter(typeof(CustomConvert))] // 指定转换器
    [TypeConverter(typeof(CustomConvert))] // 指定转换器 public CustomData Custom
    public CustomData Custom {
    { get { return (CustomData) this["custom"]; }
        get { return (CustomData) this["custom"]; } set { this["custom"] = value; }
        set { this["custom"] = value; } }
    } }
}
 public class Program
public class Program {
{ static void Main(string[] args)
    static void Main(string[] args) {
    { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
 ConfigSectionData data = new ConfigSectionData();
        ConfigSectionData data = new ConfigSectionData(); data.Id = 1000;
        data.Id = 1000; data.Time = DateTime.Now;
        data.Time = DateTime.Now; data.Custom = new CustomData("abcdefg
        data.Custom = new CustomData("abcdefg ");
");
 config.Sections.Add("add", data);
        config.Sections.Add("add", data); config.Save(ConfigurationSaveMode.Minimal);
        config.Save(ConfigurationSaveMode.Minimal);
 // 读取测试
        // 读取测试 ConfigSectionData configData = (ConfigSectionData) config.Sections["add"];
        ConfigSectionData configData = (ConfigSectionData) config.Sections["add"]; Console.WriteLine(configData.Custom.S);
        Console.WriteLine(configData.Custom.S); }
    } }
}保存后的配置文件 
 <?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?> <configuration>
<configuration> <configSections>
  <configSections> <section name="add" type="
    <section name="add" type=" " />
" /> </configSections>
  </configSections> <add id="1000" time="04/17/2006 22:06:58" custom="abcdefg
  <add id="1000" time="04/17/2006 22:06:58" custom="abcdefg " />
" /> </configuration>
</configuration>更详细的信息可以看 MSDN 中关于 System.Configuration.ConfigurationConverterBase 的说明。
 
                    
                
 
     
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号