【问题标题】:C#'s application configuration "app.config" file... how to store collections?C#的应用程序配置“app.config”文件...如何存储集合?
【发布时间】:2011-12-13 22:06:24
【问题描述】:

我正在使用 C# 编写服务,我需要在 app.config 文件中存储一个字符串列表。我有 161 个。

如何将这些信息存储在 app.config 文件中?一定有办法,因为这些是强类型值,因此我应该在代码中轻松使用任何有效的 .NET 类型来访问它们!

我想避免使用逗号分隔的列表来解决明显的性能问题。

【问题讨论】:

  • 逗号分隔的列表会如何影响性能?我之前在配置文件中使用了逗号分隔的字符串,没有发现任何性能问题。
  • @Tim - 我同意性能,如果可能不是这个的驱动程序,但对于 161 个项目,逗号分隔的列表不是 app.config 文件中最优雅的解决方案。鉴于 app.config 是 XML 并且无论如何都会被反序列化,因此将数据以 XML 形式存储在其中会更好。

标签: c# app-config


【解决方案1】:

我使用 Microsoft 的 Visual Studio 2010。

  1. Solution Explorer 中,展开项目的 Properties 节点。

  2. Solution Explorer 中,双击要在其中添加新设置的 .settings 文件。此文件的默认名称是 Settings.settings

  3. Settings Designer 中,设置 NameTypeScope您的设置的价值。每行代表一个设置。

  4. 您需要的类型是System.Collections.Specialized.StringCollection。这可以在单击设置 Type 时出现的 DropDownList 末尾的 Browse 后找到。

  5. 单击出现在 Value 文本框末尾的按钮。

  6. 在出现的对话框中逐一输入字符串。

【讨论】:

    【解决方案2】:

    有一篇关于在您的 app.config 文件中存储列表(或任何自定义对象)的好文章Best Way Of Saving Lists in App.Config

    本质上,您创建了一个表示数据的对象。

    public class MyConfig
    {
        public string[] myList;
        public string someOtherValueIfYouWant;
    }
    

    并为它编写一个配置处理程序...

    public class ConfigSectionHandler : IConfigurationSectionHandler
    {
        public const string SECTION_NAME = "MyConfig";
        public object Create(object parent, object configContext, XmlNode section)
        {
            string szConfig = section.SelectSingleNode("//MyConfig").OuterXml;
            MyConfig retConf = null;
    
            if (szConfig != string.Empty || szConfig != null)
            {
                XmlSerializer xsw = new XmlSerializer(typeof(MyConfig));
                MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szConfig));
                ms.Position = 0;
                retConf = (MyConfig)xsw.DeSerialize(ms);
            }
            return retConf;
        }
    
    }
    

    这允许您将以下 XML 放入您的 app.config 文件中...

    告诉 app.config 你很酷的配置部分

    <configSections>
        <section name="MyConfig" type="ConfigSectionHandler,someAssembly" />
    </configSection>
    

    然后添加您的配置部分...

    <MyConfig>
        <myList>First one</myList>
        <myList>Second one</myList>
        <myList>Keep going</myList>
        <myList>And so on</myList>
        <someOtherValueIfYouWant>some non array config</someOtherValueIfYouWant>
    </MyConfig>
    

    【讨论】:

    • 警告:本主题使用 System.Configuration.IConfigurationSectionHandler 接口,该接口已在 .NET Framework 2.0 版中弃用。有关使用 System.Configuration.ConfigurationSection 类的示例,请参阅如何:使用 ConfigurationSection 创建自定义配置部分 (msdn.microsoft.com/en-us/library/2tw134k3(v=vs.100).aspx)
    【解决方案3】:

    https://stackoverflow.com/a/30178144/878539

    StringCollection 在 VS2015RC 中是推荐的,目的是在加载项目的属性设置对话框窗口并重新保存数据时感到烦恼。如果您有十几个 serializeAs="Xml" 条目,并且每次打开属性窗口时,它都会弹出一个对话框,每个条目都会告诉您确认覆盖。是/否绝对没有任何作用。

    每个文件的数据不匹配都会关闭此功能,这是一个已知问题。请参阅我的其他相关帖子。

    我会否决你使用 VS2010 并提出这样的建议,但我没有足够的代表,而且它在 VS2015RC 中仍然存在。

    使用自定义配置存储等变通方法,或找到一种方法将您的集合排除在设计器或 app.config 之外。一个或另一个。

    仅适用于那些愿意忍受唠叨对话框窗口或很少编辑设置属性信息的人的可行解决方案。

    您会推荐 nag screen nuciences 用于生产或发布到任何类型的商业项目吗? :P

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2012-11-29
      • 1970-01-01
      • 2021-11-06
      • 2011-02-25
      相关资源
      最近更新 更多