Visual Studio .NET 2002.NET 1.0Windows 2003.NET 1.1Windows 2000Windows XP中级开发Visual StudioWindows.NETC#
.NET 配置设置类的一个扩展






4.55/5 (33投票s)
2003年7月15日
1分钟阅读

226535

1291
一个类,用于轻松访问和更新 .NET 应用程序的配置设置
引言
在 System.Configuration
命名空间中,您会找到一个名为 ConfigurationSettings
的 sealed
类,它提供了对名为 AppSettings
的 static
NameValueCollection
的访问。这个 ConfigurationSettings
类允许您访问存储在基于 XML 的配置文件中的信息。该文件通常以可执行文件的名称加上 ".config" 文件扩展名命名。这个类的主要固有问题是,您只能通过这个类从配置文件中读取值,没有提供更新方法。我已经在下面的 ConfigSettings
类中解决了这个问题。我还更新了该类以实现 IConfigurationSectionHandler
接口,我计划在本文中详细介绍,一旦我有更多时间(感谢 Heath 的建议)。Reflector 帮了大忙,还有就是简单地阅读文档。如果我遗漏了什么,请在底部留言。希望对您有所帮助。
需要以下命名空间
using System;
using System.IO;
using System.Xml;
using System.Reflection;
using System.Collections;
using System.Globalization;
using System.Configuration;
using System.Collections.Specialized;
该类的结构如下
namespace Configuration
{
public class ConfigSettingsSectionHandler : IConfigurationSectionHandler
{
static ConfigSettingsSectionHandler(){}
public object Create(object parent, object configContext,
System.Xml.XmlNode section)
{
NameValueCollection col = new NameValueCollection(
new CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture),
new CaseInsensitiveComparer(CultureInfo.InvariantCulture));
foreach(XmlNode node in section.ChildNodes)
{
switch(node.Name)
{
case "add":
col.Add(node.Attributes["key"].Value,
node.Attributes["value"].Value);
break;
}
}
return col;
}
}
public class ConfigSettings
{
private string _configfilename, _query, _sectionName;
private XmlDocument _doc;
private XmlTextWriter _writer;
private XmlNodeList _nodes;
private XmlElement _appsettings, _node;
private XmlAttribute _attr1, _attr2;
private bool _bFileExists;
public ConfigSettings()
{
if(File.Exists(Assembly.GetExecutingAssembly().ToString() +
".exe.config"))
{
this.ConfigFileName =
Assembly.GetExecutingAssembly().ToString() + ".exe.config";
_bFileExists = true;
}
else
{
_bFileExists = false;
}
}
public ConfigSettings(string ConfigFileName)
{
if(File.Exists(ConfigFileName))
{
this.ConfigFileName = ConfigFileName;
_bFileExists = true;
}
else
{
_bFileExists = false;
}
}
public NameValueCollection GetConfig()
{
return (NameValueCollection)ConfigurationSettings.GetConfig(
SectionName);
}
public NameValueCollection GetConfig(string SectionName)
{
return (NameValueCollection)ConfigurationSettings.GetConfig(
SectionName);
}
public string GetValue(string AttributeName)
{
NameValueCollection col = this.GetConfig();
if(col[AttributeName] != null)
return Convert.ToString(col[AttributeName].ToString());
else
return String.Empty;
}
public void SetValue(string AttributeName, string Value)
{
XmlDocument = new XmlDocument();
XmlDocument.Load(this.ConfigFileName);
Query = "configuration/" + SectionName;
AppSettingsNode =
(XmlElement)this.XmlDocument.SelectSingleNode(this.Query);
if(AppSettingsNode == null)
return;
Query += "/add[@key='" + AttributeName.ToString() + "']";
XmlNodeList = this.XmlDocument.SelectNodes(this.Query);
if(XmlNodeList.Count > 0)
Node = (XmlElement)XmlNodeList[0];
else
{
Node = this.XmlDocument.CreateElement("add");
XmlAttribute1 =
this.XmlDocument.CreateAttribute("key");
XmlAttribute1.Value = AttributeName.ToString();
Node.Attributes.SetNamedItem(XmlAttribute1);
XmlAttribute2 =
this.XmlDocument.CreateAttribute("value");
Node.Attributes.SetNamedItem(XmlAttribute2);
AppSettingsNode.AppendChild(Node);
}
Node.Attributes["value"].Value = Value.ToString();
this.XmlDocument.Save(this.ConfigFileName);
}
public void CreateConfigFile(string ConfigFileName,
string sectionName)
{
FileStream file = new FileStream(ConfigFileName,
System.IO.FileMode.Create);
file.Close();
Writer = new XmlTextWriter(ConfigFileName,
System.Text.Encoding.Unicode);
Writer.Formatting = Formatting.Indented;
Writer.WriteRaw("<?xml version=\"1.0\" ?>\n");
Writer.WriteRaw("<configuration>\n");
Writer.WriteRaw("<configSections>\n");
string str = String.Format("<section type="{1}" name="{0}" />\n",
"\"" + sectionName.ToString() + "\"",
"\"Configuration.ConfigSettingsSectionHandler, Configuration\"");
Writer.WriteRaw(str.ToString());
Writer.WriteRaw("</configSections>\n");
Writer.WriteRaw("<" + sectionName.ToString() + ">\n");
Writer.WriteRaw("</" ? + sectionName.ToString()>\n");
Writer.Flush();
Writer.Close();
}
}
public string ConfigFileName
{
get{ return _configfilename;}
set{ _configfilename = value;}
}
public XmlDocument XmlDocument
{
get{ return _doc;}
set{ _doc = value;}
}
public XmlTextWriter Writer
{
get{ return _writer;}
set{ _writer = value;}
}
public XmlNodeList XmlNodeList
{
get{ return _nodes;}
set{ _nodes = value;}
}
public XmlElement AppSettingsNode
{
get{ return _appsettings;}
set{ _appsettings = value;}
}
public XmlElement Node
{
get{ return _node;}
set{ _node = value;}
}
public string Query
{
get{ return _query;}
set{ _query = value;}
}
public XmlAttribute XmlAttribute1
{
get{ return _attr1;}
set{ _attr1 = value;}
}
public XmlAttribute XmlAttribute2
{
get{ return _attr2;}
set{ _attr2 = value;}
}
public string SectionName
{
get{ return _sectionName;}
set{ _sectionName = value;}
}
public bool FileExists
{
get{return _bFileExists;}
set{_bFileExists = value;}
}
}
使用该类
要使用该类,您只需执行以下操作之一
private ConfigSettings config = new ConfigSettings();
然后只需使用 GetConfig()
、GetValue()
和 SetValue()
方法,如下所示
private void Form1_Load(object sender, System.EventArgs e)
{
config.ConfigFileName = "Test.exe.config";
config.SectionName = "ApplicationData";
string height = config.GetValue("Height");
if(height != String.Empty)
this.Height = Convert.ToInt32(height.ToString());
// or return the whole collection of a particular section.
NameValueCollection collection = config.GetConfig("ApplicationData");
if(collection["Width"] != null)
this.Width = Convert.ToInt32(collection["Width"].ToString());
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
config.SectionName = "ApplicationData";
config.SetValue("Height", this.Height.ToString());
config.SetValue("Width", this.Width.ToString());
}
结论
我只是想发布最新的更新,还有很多更改即将到来,包括代码清理以及更多与config 文件交互的方法。请告诉我您的想法。
历史
- 2003 年 8 月 20 日:初始发布
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。