【发布时间】:2011-04-27 07:03:30
【问题描述】:
我正在编写一个需要存储一些配置信息的程序。我认为 XML 会是一个不错的选择,但我不想从头开始学习 C# 中的 XML。
你能推荐处理这个任务的好方法/类吗?
【问题讨论】:
标签: c# xml configuration
我正在编写一个需要存储一些配置信息的程序。我认为 XML 会是一个不错的选择,但我不想从头开始学习 C# 中的 XML。
你能推荐处理这个任务的好方法/类吗?
【问题讨论】:
标签: c# xml configuration
只需使用内置的 .NET 配置系统!这有什么问题??
为此,将System.Configuration 的引用添加到您的项目中,并仔细查看该命名空间中的ConfigurationManager 类。
从 Visual Studio 2005 开始,您还可以在 VS 内的可视化设计器中定义应用程序或用户范围的设置 - 请查看 MSDN 上的 Application Settings Overview 了解相关信息(这些适用于 Winforms 和控制台应用程序)。对于应用程序范围的设置,这些设置存储在您的app.config/web.config 中,对于用户范围的设置,这些设置存储在用户帐户可访问的目录中的单独user.config 文件中。这些可以在运行时使用标准 .NET 类(来自 System.Configuration 命名空间)进行操作和更新。
【讨论】:
虽然我同意“重新发明轮子”不是一个好主意,但 .NET System.Configuration 类很难用于这样一个简单的任务。
我需要创建单独的配置文件,可以在命令行上为我的一个程序指定(而不是默认假设它是“app.config”),所以我使用了这个简单的类 - 它将自己保存到一个XML 文件。
【讨论】:
这里有一个简单的小 sn-p 可以帮助您入门。你不需要知道任何 xml...
internal static string GetConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName].ToString();
}
internal static bool GetConfigSettingBool(string settingName)
{
string setting = GetConfigSetting(settingName);
if (string.IsNullOrEmpty(setting)) return false;
bool value = false;
if (bool.TryParse(setting, out value))
return value;
else
return false;
}
internal static string[] GetConfigSettingsArray(string settingName)
{
return GetConfigSetting(settingName).Split(',');
}
internal static DateTime? GetConfigSettingDateTime(string settingName)
{
string setting = GetConfigSetting(settingName);
DateTime retval;
if (DateTime.TryParse(setting, out retval))
{
return retval;
}
else
{
return null;
}
}
internal static void SetConfigSetting(string settingName, string value){
ConfigurationManager.AppSettings[settingName] = value;
}
【讨论】:
我已经使用 XML 配置类型设置有一段时间了,它是在内置配置之外运行的,这有点整洁。基本上,您可以给它一个提示,它会为您将 xml 反序列化为一个对象。我认为我得到这个的原始来源是 here,但我不是 100% 确定,所以如果有人知道作者,请编辑我的回复以给予适当的信任。
这是实际进行反序列化的类:
using System.Configuration;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.XPath;
namespace Ariel.Configuration
{
class XmlSerializerSectionHandler : IConfigurationSectionHandler
{
public object Create(object parent, object configContext, XmlNode section)
{
XPathNavigator nav = section.CreateNavigator();
string typename = (string)nav.Evaluate("string(@type)");
Type t = Type.GetType(typename);
XmlSerializer ser = new XmlSerializer(t);
return ser.Deserialize(new XmlNodeReader(section));
}
}
}
现在,您可以创建任何您想要配置的类。
namespace MyProject.Config {
public class TestConfig {
/// <summary>
/// Whether the session is enabled
/// </summary>
public bool Enabled { get; set; }
}
}
现在,您只需要一个 app.config 文件。我通常更喜欢为每个配置类使用单独的配置文件的样式,所以我举个例子。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="TestConfig" type="Ariel.Configuration.XmlSerializerSectionHandler, Ariel"/>
</configSections>
<runtime>
<gcServer enabled="true"/>
</runtime>
<TestConfig configSource="Config\\TestConfig.config" />
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
重要的部分是: section name = "TestConfig"
在您的 TestConfig.config 文件中,您将拥有如下内容:
<?xml version="1.0" encoding="utf-8" ?>
<TestConfig type="MyProject.Config.TestConfig, MyProject">
<Enabled>True</Enabled>
</TestConfig>
同样重要的部分是对类名和类型的引用。
最后但同样重要的是,加载您的配置:
using System.Configuration;
Config.SessionKillConfig config = null;
try {
config = (Config.SessionKillConfig)ConfigurationManager.GetSection("CdrAnalyzerConfig");
} catch (System.Configuration.ConfigurationException ex) {
syslog.Fatal("Loading parser configuration failed", ex);
return;
}
if(config.Enabled) { //do stuff }
这可能有点啰嗦,但问题是,它非常便携。基本上,要包含配置,您所要做的就是编写一个类,然后编写一个与之匹配的 xml 文件。
我不是 100% 确定如何将配置文件作为参数传递给程序,但我想 ConfigurationManager 类中有一个选项可以做到这一点。我什至认为我在某处读到有人正在努力让它检测文件的更改并将新配置重新加载到正在运行的程序中,但我没有尝试过类似的事情。无论如何,我希望该示例对您可以采用的一种方法有用。
【讨论】: