迭代设置文件

时间:2015-07-21 13:48:12

标签: c# settings application-settings

我目前正在开发一个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”设置的实际

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

3 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

一旦你看到(无需迭代类型,也不需要使用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的方法,但我相信这也会让其他人受益。