我目前正在開發一個軟件,用戶不應該能夠訪問它的後端,但應該仍然能夠輕鬆更改配置/設置應用。 我決定最好的方法是定製的「配置文件(.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);
}
}
}
ConfigFile.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);
}
}
ConfigFile.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。我知道這些,但我決定不去使用它的原因是,應該能夠更改配置文件的用戶沒有關於這些格式的經驗,我正試圖使配置文件儘可能簡單。 –
我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –