C# 迭代设置文件

C# 迭代设置文件,c#,settings,application-settings,C#,Settings,Application Settings,我目前正在从事一个VSTO项目,我有5个。设置文件: 设置。设置(默认) s201213.设置 s201314.设置 s201415.设置 s201516.设置 随着时间的推移,将有更多的设置文件遵循相同的命名约定(“s”后跟一个纳税年度) 我知道我可以遍历设置文件,但是有没有方法遍历实际的设置文件本身 我尝试过以下方法: public void Example() { System.Collections.IEnumerator testSetti

我目前正在从事一个VSTO项目,我有5个
。设置
文件:

  • 设置。设置
    (默认)
  • s201213.设置
  • s201314.设置
  • s201415.设置
  • s201516.设置
随着时间的推移,将有更多的设置文件遵循相同的命名约定(“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);
                    }
                }   
            }  
似乎在识别设置文件和存储值:

输出:

但是,我似乎无法获得“LEL”设置的实际值,该设置应返回一个
双精度


第二次更新

实际上,我已经放弃了,并决定使用本地数据库来代替它——但我仍然想知道这是否可行,我想其他人也会想知道,所以我打算悬赏它,以尝试产生一些兴趣。

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

一旦看到它,答案就非常简单(不需要迭代类型,也不需要使用System.IO目录):


我同意你使用dB的方法,尽管我相信这也会让其他人受益

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.
}

我已经尝试了
System.IO
名称空间,但仍然看不到任何东西来获取项目文件的枚举数。我开始认为我可能不得不想出一些解决办法:(
System.IO
名称空间没有为*.settings文件提供任何特殊的功能。但是它允许查找具有指定扩展名的所有文件,并对每个文件进行检查。好的,我想我遵循您的逻辑-让我再玩一玩。干杯!您是否否决了我的投票?时报匹配,您的答案不包括在这一组中。)Ting会写入app.config,因此您提供的答案完全不符合要求,如果有任何问题,此答案应该会获得否决票。好的,抱歉。通常我发现您的答案质量很高。谢谢,我会在稍后回到自己的PC时尝试此方法-如果我理解,这是在解析XML配置文件以获取我需要的值吗nstead?从没想过…(标签编辑也很感激,干杯!)请原谅我的无知,因为我仍在学习C#和VS的基础知识,
GetSettingFilesValues.exe.config
不存在于
XLSTART
Assembly.getExecutingGassembly.BaseDirectory
中,所以我暂时硬编码了
app.config
文件的路径。这是否正确?我在上遇到了一个异常
section.Settings.Get(“LEL”)
声明“对象引用未设置为对象实例”。是的,这对于VSTO是正确的,加载项配置文件就是您想要的。在我的示例中,我使用了winform应用程序。对于web开发人员,他们将使用指向其web.config的路径。要克服此异常,请调试代码并仔细检查所有内容:文件路径正确,您的使用应用程序与用户设置,等等。设置将写入配置文件w编译应用程序时,如果app.Config可能不正确,请在Bin\Debug文件夹中检查编译后的app.Config…最后一个经常让我感到困惑的提示是关于.Config文件上下文,请参见此处的解释:
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);
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.
}