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