有没有办法在不知道部分名称的情况下读取配置部分? (还有更多)

Is there a way to read configuration sections without knowing the name of the sections? (And some more)

我正在使用一个程序,它需要处理一些所谓的“接口”。程序不知道那些“接口”的名称,但程序需要能够读取配置文件中提供的接口名称、字段名称和值。

为此,我创建了一个“App.config”文件,如下所示:

<configuration>
    <configSections>
        <sectionGroup name="interfaces">
            <section name="IF1" type="System.Configuration.AppSettingsSection"/>
            <section name="IF2" type="System.Configuration.AppSettingsSection"/>
            <section name="IF3" type="System.Configuration.AppSettingsSection"/>
        </sectionGroup>
    </configSections>
    <interfaces>
        <IF1>
            <add key="IF1.ENABLE" value="false"/>
        </IF1>
        <IF2>
            <add key="IF2.ENABLE" value="true"/>
            <add key="IF2.ENABLE_EVENTS" value="true"/>
            <add key="IF2.MAX" value="1000"/>
            <add key="IF2.MIN" value="100"/>
        </IF2>
        ...

但是,为了读取配置文件中的信息,我使用了以下代码(有相应的问题):

NameValueCollection settings = ConfigurationManager.GetSection("interfaces")   as NameValueCollection;
  // returns "null"
NameValueCollection settings = ConfigurationManager.GetSection("interfaces/*") as NameValueCollection;
  // returns "null"
NameValueCollection settings = ConfigurationManager.GetSection("interfaces/IF1") as NameValueCollection;
  // works OK, but it means that the name of the interface needs to be known by the application.

在 watch-window 中检查 settings(从最后一行开始)时,这是我发现使用 Add watch 查看第一个条目值的方法(请不要笑):

new System.Collections.ArrayList.ArrayListDebugView(
  ((System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry)
   (new System.Collections.Hashtable.HashtableDebugView(settings._entriesTable).Items[0]).Value).Value).Items[0]

尝试查看此内容无效,原因很简单 settings._entriesTable 是私有的,因此无法访问。

有没有人知道一个简单的表达方式:(伪代码)

foreach (entry) in configuration.interfaces
{
  foreach (interface_entry) in configuration.interfaces.getSection(entry.name)
  {
    string keyname   = interface_entry.key;
    string valuename = interface_entry.value;
  }
}

还是我的配置文件格式完全错误?

我尝试使用 this proposed duplicate 中的代码,但我需要做一些修改:

private static List<string> GetNames(ConfigurationSectionGroup configSectionGroup)
{
    var names = new List<string>();
    foreach (ConfigurationSectionGroup csg in configSectionGroup.SectionGroups)
        names.AddRange(GetNames(csg));

    foreach (ConfigurationSection cs in configSectionGroup.Sections)
        if (configSectionGroup.SectionGroupName == "interfaces")
        names.Add(cs.SectionInformation.SectionName);

    return names;
}

显然,原始代码 returns 条目类似于 interfaces/interfaces/IF1,而我只想要 interfaces/IF1。在评论中添加 configSectionGroup.SectionGroupName 可解决此问题。

main 函数原来包含两部分:

/* Section 1 */
foreach (ConfigurationSectionGroup csg in config.SectionGroups)
  names.AddRange(GetNames(csg));
         
/* Section 2 */
foreach (ConfigurationSection cs in config.Sections)
  names.Add(cs.SectionInformation.SectionName);

我不知道“第 2 部分”到底做了什么(它从哪里获取信息),但我已将其从我的代码中删除,现在它工作正常。