【问题标题】:Array of structures in Application Settings应用程序设置中的结构数组
【发布时间】:2015-05-27 04:15:17
【问题描述】:

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

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

这是一个由基本类型组成的相对轻量级的结构,但到目前为止,我发现的最简洁的方法是创建一个新类(!)只是为了保存三元组数组,使用自定义序列化来适应类/反序列化代码,然后将其设置为单个“设置”的类型。
可以做到这一点,但考虑到大多数应用程序设置是多么的不干涉,这听起来确实像是一种可能以更直接的方式可行的事情。

那么有这样的方法吗?

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

ETA:问题的关键不在于服务器名称或端口号,而在于结构相同的元组数组简单的数据,每个单独的数据都会被简单地保存。

【问题讨论】:

  • 你为什么要允许用户添加和删除这样的设置..你不应该是设置它的人..吗?你能展示一个你正在尝试做的事情的编码示例,并且配置文件可以有你喜欢的关于指向特定服务器的设置
  • 我没有任何说明性代码可显示,抱歉。假设我的程序相当于一个 IRC 客户端,并且用户需要能够在配置中为多个服务器设置(并保存)连接详细信息,以便他/她可以通过单击按钮连接到所有这些服务器稍后。
  • 伙计们,当否决(或投票结束)一个并非公然不清楚、无用或未经研究的问题时,请评论该问题的问题所在。它将帮助我和读者学习如何提出更好的问题。
  • 应用程序设置并不是最好的地方。通常,只需将设置保存到 %AppData% 或 %ProgramData% 中的 XML 或 JSON 格式文件。
  • 听起来您对“琐碎阅读”和“琐碎保存”的设置同样感兴趣?或者你不介意有一个代码方法来解析配置?

标签: c# windows application-settings


【解决方案1】:

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

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();

【讨论】:

  • 最好使用序列化程序对应用程序设置值中的信息进行编码,而不是使用自定义编码字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2015-02-08
  • 2021-04-27
相关资源
最近更新 更多