我正在编写一个需要存储一些配置信息的程序。我认为XML是一个不错的选择,但我不想从头学习C#中的XML。
您能推荐处理此任务的好方法/类吗?
答案 0 :(得分:7)
只需使用内置的.NET配置系统!这有什么问题??
为此,将System.Configuration
的引用添加到项目中,并仔细查看该命名空间中的ConfigurationManager
类。
从Visual Studio 2005开始,您还可以在VS中的可视化设计器中定义应用程序或用户范围的设置 - 在MSDN上查看Application Settings Overview(适用于Winforms和控制台应用程序)。这些设置存储在app.config
/ web.config
中,用于应用程序作用域设置,并存储在用户帐户可访问的目录中的单独user.config
文件中,用于用户作用域设置。这些可以在运行时使用标准.NET类(来自System.Configuration
命名空间)进行操作和更新。
答案 1 :(得分:1)
虽然我同意“重新发明轮子”并不是一个好主意,但.NET System.Configuration类很难用于这么简单的任务。
我需要创建单独的配置文件,可以在我的一个程序的命令行中指定(而不是默认,假设它是“app.config”)所以我使用了这个简单的类 - 它将自己保存到一个XML文件。
答案 2 :(得分:0)
这是一个简单的小片段,可以帮助您入门。你不需要知道任何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;
}
答案 3 :(得分:0)
我一直在使用XML配置类型设置已经有一段时间了,它使用内置配置运行,这有点整洁。基本上,你可以给它一个提示,它会将xml反序列化为一个对象。我认为我得到的原始来源是here,但我不是百分百肯定,所以如果有人确实知道作者,请编辑我的回复以给予适当的信任。
这是实际进行反序列化的类:
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”&lt; - 配置类 type = Ariel.Configuration.XmlSerializerSectionHandler,Ariel&lt; - 用于反序列化的类型是对象中的xml。这基本上告诉配置管理器运行什么来创建我们的对象 TestConfig configSource =“Config \ TestConfig.config”&lt; - 这告诉我们在哪里可以找到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类中有一个选项可供选择。我甚至认为我读过某个人正在努力让它检测到文件的变化并将新配置重新加载到正在运行的程序中,但我没有尝试过类似的东西。无论如何,我希望这个例子对你可以采取的一种方法很有用。