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

时间:2015-03-24 00:03:10

标签: c# windows application-settings

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

说我的程序有(用户范围)设置,如"服务器名称","地址","端口"。我只是将这三个添加到应用程序设置中,作为两个字符串和一个int 但是如果我的程序配置需要处理多个这样的服务器,用户可以添加和删除任意数量的服务器呢?我希望设置包含三元组数组,每个三元组由两个字符串和一个int组成,应用程序设置似乎不太支持。

它是一个由基本类型组成的相对轻量级的结构,但到目前为止,我发现这样做最干净的方法是创建一个新类(!)来保存三元组数组,以适应具有自定义序列化/反序列化代码的类,然后将其设置为单个"设置的类型"。
可以这样做,但考虑到大多数应用程序设置是如何放手的,这真的闻起来像是可以用更直接的方式做的事情。

那么有这样的方法吗?

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

ETA:问题的重点在于服务器名称或端口号,它位于同构结构数组中>元组简单数据,其中每个单独的数据将被轻易保存。

1 个答案:

答案 0 :(得分:0)

您可以考虑为值部分设置一个自定义字符串,一个可以解析的字符串(类似于连接字符串),然后需要一个以常量开头的键名,如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();