应用程序设置中的结构数组

Array of structures in Application Settings

在 .NET 中保存一系列结构相同的简单配置元组的干净、规范的方法是什么Application Settings

假设我的程序有(用户范围)设置,如 "server name"、"address"、"port"。我只是将这三个作为两个字符串和一个整数添加到应用程序设置中。
但是,如果我的程序配置需要处理多个这样的服务器,用户可以在其中添加和删除任意数量的服务器怎么办?我希望设置包含一组三元组,每个三元组由两个字符串和一个 int 组成,而应用程序设置似乎不太支持。

这是一个由基本类型组成的相对轻量级的结构,但到目前为止,我发现最干净的方法是创建一个新的 class(!) 来保存三元组数组,适合class 自定义 serialization/deserialization 代码,然后将其设置为单个 "setting".
的类型 我 可以 这样做,但考虑到大多数应用程序设置是如何不干涉的,这确实听起来像是可以以更直接的方式实现的东西。

那么有这样的方法吗?

(是的,我看过 "int[] array in application Settings" 问题,那里的有用答案在这种情况下没那么有用。)

ETA: 问题的重点不在服务器名称或端口号中,它在相同结构的 array元组 简单数据,其中每个单独的数据都会被简单地保存。

您可能会考虑为值部分使用一个自定义字符串,您可以对其进行解析(类似于连接字符串),然后需要一个以常量开头的键名,例如 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>

并考虑一种知道如何将有效的 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);
}

然后,当您解析 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();