hem*_*lit 5 c# windows application-settings
在 .NET应用程序设置中保存一系列结构相同的简单配置元组的干净、规范的方法是什么?
假设我的程序有(用户范围)设置,如“服务器名称”、“地址”、“端口”。我只是将这三个作为两个字符串和一个 int 添加到应用程序设置中。
但是如果我的程序的配置需要处理多个这样的服务器,用户可以在其中添加和删除任意数量的服务器怎么办?我希望设置包含一组三元组,每个三元组由两个字符串和一个 int 组成,而应用程序设置似乎不太支持这一点。
这是一个由基本类型组成的相对轻量级的结构,但到目前为止,我发现的最简洁的方法是创建一个新类(!)来保存三元组数组,用自定义序列化/反序列化代码来适应类,然后将其设置为单个“设置”的类型。
我可以做到这一点,但考虑到大多数应用程序设置是多么的不干涉,这真的很像一些可能以更直接的方式可行的东西。
那么有没有这样的方法呢?
(是的,我已经看到了“应用程序设置中的 int[] 数组”问题,在这种情况下,那里的有用答案并没有那么有用。)
ETA:问题的关键不在于服务器名称或端口号,而在于一组结构相同的简单数据元组,其中每个单独的数据都将被简单地保存。
您可能会考虑为值部分使用一个自定义字符串,您可以解析该字符串(类似于连接字符串),然后需要一个以常量开头的键名称,例如ServerString. 然后,您可以在代码中使用一个方法来读取以此常量开头的所有键并将值部分解析为元组。
例如,考虑 app.config 值:
<appSettings>
<add key="ServerString1" value="name=MyServerName;address=127.0.0.1;port=80" />
<add key="ServerString2" value="name=MyServerName;address=127.0.0.2;port=81" />
<add key="ServerString3" value="name=MyServerName;address=127.0.0.3;port=82" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
并考虑一种知道如何将有效value字符串解析为 的方法Tuple<string, string, int>:
private static Tuple<string, string, int> GetTupleFromServerSetting(string serverSetting)
{
if (serverSetting == null) throw new ArgumentNullException("serverSetting");
var settings = serverSetting.Split(';');
if (settings.Length != 3)
throw new ArgumentException("One or more server settings is missing.",
"serverSetting");
var name = string.Empty;
var address = string.Empty;
int port = 0;
foreach (var setting in settings)
{
var settingParts = setting.Split('=');
if (settingParts.Length != 2)
throw new ArgumentException(string.Format(
"Setting is missing a value: {0}", setting),
"serverSetting");
switch (settingParts[0].ToLower())
{
case "name":
name = settingParts[1];
break;
case "address":
address = settingParts[1];
break;
case "port":
port = int.Parse(settingParts[1]);
break;
}
}
return new Tuple<string, string, int>(name, address, port);
}
Run Code Online (Sandbox Code Playgroud)
然后,当您解析 app.config 时,您可以执行以下操作来获取所有服务器设置的列表:
List<Tuple<string, string, int>> serverSettings =
ConfigurationManager.AppSettings.AllKeys.Where(key =>
key.StartsWith("ServerString", StringComparison.OrdinalIgnoreCase))
.Select(key => GetTupleFromServerSetting(ConfigurationManager.AppSettings[key]))
.ToList();
Run Code Online (Sandbox Code Playgroud)