【发布时间】:2015-04-25 00:51:58
【问题描述】:
我目前正在开发一种软件,用户将使用该软件,这些用户应该无法访问它的所有后端,但仍应该能够轻松更改应用程序的配置/设置。 我认为最好的方法是在最终构建的根目录中自定义“配置文件 (.cfg)”。 .cfg 文件的简单示例:
serveraddress='10.10.10.10'
serverport='1234'
servertimeout='15000'
由于我希望轻松扩展配置文件,我决定使用一些自定义属性和一些简单的 LINQ。 这确实像我期望的那样工作,但由于我仍然是 .net 的新手,我担心我没有采用最好的方法,我的问题是: 我能做些什么来改善这一点吗? 还是一般来说有更好的方法来解决这个问题?
这是我用于读取配置文件并将值分配给它的相应属性的代码。
ConfigFileHandler.cs
public void ReadConfigFile()
{
var cfgFile = new ConfigFile();
var configLines = File.ReadAllLines("configfile.cfg");
var testList = configLines.Select(line => line.Split('='))
.Select(splitString => new Tuple<string, string>(splitString[0], splitString[1].Replace("'", "")))
.ToList();
foreach (var prop in typeof(ConfigFile).GetProperties())
{
var attrs = (ConfigFileFieldAttribute[])prop.GetCustomAttributes
(typeof(ConfigFileFieldAttribute), false);
foreach (var t in from attr in attrs from t in testList where t.Item1 == attr.Name select t)
{
prop.SetValue(cfgFile, t.Item2);
}
}
}
配置文件.cs
class ConfigFile
{
private static string _serverAddress;
private static int _serverPort;
private static int _serverTimeout;
[ConfigFileField(@"serveraddress")]
public string ServerAddress
{
get { return _serverAddress; }
set { _serverAddress= value; }
}
[ConfigFileField(@"serverport")]
public string ServerPort
{
get { return _serverPort.ToString(); }
set { _serverPort= int.Parse(value); }
}
[ConfigFileField(@"servertimeout")]
public string ServerTimeout
{
get { return _serverTimeout.ToString(); }
set { _serverTimeout= int.Parse(value); }
}
}
任何关于编写更好看的代码的技巧都将受到高度赞赏!
更新: 感谢所有反馈。
以下是最后一堂课! https://dotnetfiddle.net/bPMnJA 一个活生生的例子
请注意,这是 C# 6.0
ConfigFileHandler.cs
public class ConfigFileHandler
{
public void ReadConfigFile()
{
var configLines = File.ReadAllLines("configfile.cfg");
var configDictionary = configLines.Select(line => line.Split('='))
.Select(splitString => new Tuple<string, string>(splitString[0], splitString[1].Replace("'", "")))
.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
ConfigFile.SetDictionary(configDictionary);
}
}
配置文件.cs
public class ConfigFile
{
private static Dictionary<string, string> _configDictionary;
public string ServerAddress => PullValueFromConfig<string>("serveraddress", "10.1.1.10");
public int ServerPort => PullValueFromConfig<int>("serverport", "3306");
public long ServerTimeout => PullValueFromConfig<long>("servertimeout", "");
private static T PullValueFromConfig<T>(string key, string defaultValue)
{
string value;
if (_configDictionary.TryGetValue(key, out value) && value.Length > 0)
return (T) Convert.ChangeType(value, typeof (T));
return (T) Convert.ChangeType(defaultValue, typeof (T));
}
public static void SetDictionary(Dictionary<string, string> configValues)
{
_configDictionary = configValues;
}
}
【问题讨论】:
-
为什么要重新发明轮子?配置文件是一个已解决的问题。您可以使用例如XML 或 JSON 序列化,或 .NET .config 文件
-
感谢您的评论 Thomas Levesque。我知道这些,但我决定不使用它的原因是因为应该能够更改配置文件的用户对这些格式没有经验,因此我试图使配置文件尽可能简单。跨度>
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
标签: c# properties configuration attributes