如何获取特定类型的所有部分

时间:2015-06-03 20:04:27

标签: c# configuration

假设我的配置中包含以下内容:

<configSections>
  <section name="interestingThings" type="Test.InterestingThingsSection, Test" />
  <section name="moreInterestingThings" type="Test.InterestingThingsSection, Test" />
</configSections>

<interestingThings>
  <add name="Thing1" value="Seuss" />
</interestingThings>

<moreInterestingThings>
  <add name="Thing2" value="Seuss" />
</moreInterestingThings>

如果我想获得任何一个部分,我可以很容易地通过名字获得它们:

InterestingThingsSection interesting = (InterestingThingsSection)ConfigurationManager.GetSection("interestingThings");
InterestingThingsSection more = (InterestingThingsSection)ConfigurationManager.GetSection("moreInterestingThings");

但是,这依赖于我的代码知道如何在配置中命名该部分 - 它可以被命名为任何东西。我更喜欢的是能够从配置中提取InterestingThingsSection类型的所有部分,无论名称如何。如何以灵活的方式解决这个问题(因此,支持应用程序配置和Web配置)?

编辑:如果您已经拥有Configuration,那么获取实际部分并不会太困难:

public static IEnumerable<T> SectionsOfType<T>(this Configuration configuration)
    where T : ConfigurationSection
{
    return configuration.Sections.OfType<T>().Union(
        configuration.SectionGroups.SectionsOfType<T>());
}

public static IEnumerable<T> SectionsOfType<T>(this ConfigurationSectionGroupCollection collection)
    where T : ConfigurationSection
{
    var sections = new List<T>();
    foreach (ConfigurationSectionGroup group in collection)
    {
        sections.AddRange(group.Sections.OfType<T>());
        sections.AddRange(group.SectionGroups.SectionsOfType<T>());
    }
    return sections;
}

但是,如何以一般适用的方式获取Configuration实例?或者,我如何知道是否应该使用ConfigurationManagerWebConfigurationManager

3 个答案:

答案 0 :(得分:1)

到目前为止,这似乎是最好的方式:

var config = HostingEnvironment.IsHosted
    ? WebConfigurationManager.OpenWebConfiguration(null) // Web app.
    : ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // Desktop app.

答案 1 :(得分:0)

也许不是最好的方法,但您可以将配置文件作为普通xml读取,然后解析所需的部分。例如,如果它是一个Web应用程序:

XmlDocument myConfig= new XmlDocument();
myConfig.Load(Server.MapPath("~/Web.config"));
XmlNode xnodes = myConfig.SelectSingleNode("/configSections");

现在,您可以看到您关心的节点在运行时发现名称,然后访问配置文件的特定节点。

另一种解决方案是:

Path.GetFileName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)

如果这返回&#34; web.config&#34;,则它可能是一个Web应用程序。

但是,HostingEnvironment.IsHosted旨在指示appdomain是否配置为在ASP.NET下运行,因此不确定您的是否为Web应用程序。

答案 2 :(得分:0)

尝试使用ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)方法。它将当前应用程序的配置文件作为Configuration对象打开。

MSDN文档:https://msdn.microsoft.com/en-us/library/ms134265%28v=vs.110%29.aspx