【问题标题】:Iterate through settings files遍历设置文件
【发布时间】:2015-10-11 00:28:54
【问题描述】:

我目前正在处理一个 VSTO 项目,我有 5 个 .settings 文件:

  • Settings.settings(默认)
  • s201213.settings
  • s201314.settings
  • s201415.settings
  • s201516.settings

随着时间的推移,将包含更多遵循相同命名约定的设置文件('s' 后跟纳税年度)。

我知道我可以遍历设置文件,但有没有办法遍历实际设置文件本身?

我尝试过以下方法:

 public void Example()
        {
            System.Collections.IEnumerator testSetting = MyAddIn.Properties.s201213.Default.Properties.GetEnumerator();

            while (testSetting.MoveNext())
            {
                System.Diagnostics.Debug.WriteLine("Setting:\t" + testSetting.Current.ToString());
            } 
        }  

这显然只遍历单个设置文件,但我似乎无法弄清楚将所有设置文件作为一个集合进行迭代的逻辑,而无需在代码中明确命名每个设置文件。我希望这是有道理的,任何帮助表示赞赏。


更新:
我想我正在使用以下代码到达某个地方:

foreach(Type test in Assembly.GetExecutingAssembly().GetTypes())
            {
                if (System.Text.RegularExpressions.Regex.IsMatch(test.Name, "^s[0-9]{6}$"))
                {
                    PropertyInfo value = test.GetProperty("LEL");

                    try
                    {
                        System.Diagnostics.Debug.WriteLine("Name:\t" + test.Name + 
                                                            "\nNameSpace:\t" + test.Namespace + 
                                                            "\nProperty:\t" + test.GetProperty("LEL").ToString() +
                                                            "\n");
                    }
                    catch(Exception e)
                    {
                        System.Diagnostics.Debug.WriteLine(e.Message);
                    }
                }   
            }  

这似乎是在识别设置文件和存储的值:

输出:

Name:   s201213
NameSpace:  MyAddIn.Properties
Property:   Double LEL

Name:   s201314
NameSpace:  MyAddIn.Properties
Property:   Double LEL

Name:   s201415
NameSpace:  MyAddIn.Properties
Property:   Double LEL

Name:   s201516
NameSpace:  MyAddIn.Properties
Property:   Double LEL  

但是我似乎无法获得应该返回Double 的“LEL”设置的实际


第二次更新
我实际上已经放弃并决定改用本地数据库-但我仍然想知道这是否可能,而且我认为其他人也想知道,所以我将悬赏尝试并产生一些兴趣。

【问题讨论】:

    标签: c# settings application-settings


    【解决方案1】:

    Jeremy 的回答让我完成了帖子,但我想我会发布我使用的最终代码,以便在上下文中看到它:

    public void GetLEL()
    {
        var fileMap = new ConfigurationFileMap(AppDomain.CurrentDomain.BaseDirectory + @"CustomAddIn.dll.config");
        var configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
        var sectionGroup = configuration.GetSectionGroup("userSettings");
        var section = (ClientSettingsSection)sectionGroup.Sections.Get("MyAddIn.s201213");
        var setting = section.Settings.Get("LEL");
        System.Diagnostics.Debug.WriteLine(setting.Value.ValueXml.InnerXml);
        // Prints "107" as expected.
    }
    

    【讨论】:

      【解决方案2】:

      一看就知道答案很简单(无需遍历Types,也无需使用System.IO目录)

      using System.Configuration; //Add a reference to this DLL
      

      ...

      var fileMap = new ConfigurationFileMap(Application.StartupPath + @"\GetSettingFilesValues.exe.config");
      var configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
      var sectionGroup = configuration.GetSectionGroup("applicationSettings"); // This is the section group name, change to your needs, ie application or user
      var section = (ClientSettingsSection)sectionGroup.Sections.Get("GetSettingFilesValues.Properties.s201415"); //This is the section name, change to your needs (you know the tax years you need)
      var setting = section.Settings.Get("LEL");
      System.Diagnostics.Debug.WriteLine(setting.Value.ValueXml.InnerXml);
      

      我同意您使用 dB 的方法,但我相信这也会对其他人有益。

      【讨论】:

      • 谢谢,当我很快回到自己的电脑时,我会试试这个 - 所以如果我明白了,这是在解析 XML 配置文件中的值吗?从来没有想过... (标签编辑也很感激,干杯!)
      • 请原谅我的无知,因为我仍在学习 C# 和 VS 的基础知识 - GetSettingFilesValues.exe.configXLSTARTAssembly.GetExecutingAssembly.BaseDirectory 中不存在,所以我已经硬编码了路径暂时到我的app.config 文件。它是否正确?我在section.Settings.Get("LEL") 上遇到一个异常,指出“对象引用未设置为对象的实例”。
      • 是的,这对 VSTO 来说是正确的,AddIns 配置文件就是你想要的。在我的示例中,我使用了一个 winform 应用程序。对于 Web 开发人员,他们会使用其 web.config 的路径。
      • 为了克服异常,调试代码仔细检查一切:文件路径是否正确,您使用的应用程序与用户设置等。当您编译应用程序时,设置会写入配置文件,所以App.Config 可能不正确,请在 Bin\Debug 文件夹中查看已编译的 App.Config...
      • 最后一个让我很头疼的提示是关于 .config 文件上下文,请在此处查看我的解释:stackoverflow.com/a/11535980
      【解决方案3】:

      我相信您可以使用 System.IO 命名空间类来遍历具有相同扩展名的文件。没有内置的机制或属性。

      【讨论】:

      • 我玩过System.IO 命名空间,但仍然看不到任何东西来获取项目文件的枚举器。我开始认为我可能不得不编造某种解决方法:(
      • System.IO 命名空间没有为 *.settings 文件提供任何特殊功能。但它允许查找具有指定扩展名的所有文件并遍历它们。
      • 好吧,我想我遵循你的逻辑 - 让我再玩一些。干杯!
      • 你对我投了反对票吗?时间匹配,并且您的答案不考虑将设置写入 app.config,因此您提供的这个答案完全不合时宜,如果有的话,这个答案应该会被否决。
      • 好的,抱歉。通常我发现你的答案质量很高。
      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多