如何遍历configurationSection

时间:2012-11-13 13:39:59

标签: c# configurationsection

我的Web.config文件中有以下部分:

<configSections>
    <section name="mySection" type="myNameSpace, myProject"/>
</configSections>


<mySection>
    <city id="ny" type="nameSpace1" />
    <city id="dc" type="nameSpace2" />
    <city id="nj" type="nameSpace3" />
</mySection>

我需要编写循环遍历cities id的代码并返回type

即。

 if the given id = "ny" --> return nameSpace1
 if the given id = "dc" --> return nameSpace2
 if the given id = "nj" --> return nameSpace3

2 个答案:

答案 0 :(得分:1)

您需要参考该部分:

var theSection = (TypeOfSection)ConfigurationManager.GetSection("mySection");

注意转换为TypeOfSection - 这是在配置文件中声明的类型。

此时,您应该拥有一个可以访问并迭代的强类型对象。

答案 1 :(得分:0)

  

在我的回答中,我假设您已经编写了一个实现ConfigurationSection的类,该类具有城市集合。 –奥德于2012年11月13日在13:50

虽然我觉得它的细节不够详细,但从技术上讲,以上答案是正确的。我将尝试详细说明@Oded的响应,希望它将是一个清晰的展览!

步骤

  1. 这里要做的第一件事是实现一个新类MyConfigSection,它只是一个标准POCO (普通旧C对象),其中包含您所配置的每个配置值的属性将存储在配置源中。

    public class MyConfigSection
    {
        public City[] Cities {get; set;}
    }
    

    注意: 我们正在使用类型为City的对象数组,这将允许您根据特定用例的需要输入多个条目,尽管您不限于任何给定的类型。在这种情况下,该类的结构将如下所示:

    public class City
    {
        public string Id {get; set;}
        public string Type {get; set;}
    }
    
  2. 在您选择的源代码中创建配置部分,并为该部分命名以符合预期目的,在这种情况下,我们将调用mySection部分以匹配原始问题。

    <mySection>
        <Cities>
            <city Id="ny" Type="nameSpace1" />
            <city Id="dc" Type="nameSpace2" />
            <city Id="nj" Type="nameSpace3" />
        </Cities>
    </mySection>
    
  3. 现在,关键步骤是将MyConfigSection poco绑定到所需的配置设置部分。我们可以通过将以下代码添加到启动类中而无需通过IOptions<T>接口来实现此目的:

    var configSection = new MyConfigSection();
    Configuration.Bind("mySection", configSection);
    services.AddSingleton(configSection);
    
  4. 添加绑定并将结果对象注册到服务容器之后,现在可以通过依赖注入通过在任何方法中简单地包括类型为MyConfigSection的参数来在依赖关系注入代码库中的任何位置使用它,您需要在上述配置中存储一个值。

    public Type GetCityType(string cityId, MyConfigSection config)
    {
        var typeName = config.Cities
            .Where(x => x.Id == cityId)
            .Select(x => x.Type);
        return Type.GetType(typeName);
    }
    

    在这种特定情况下,由于您正在处理其他poco类型的数组,因此设置值的使用稍微复杂一些,尽管在LINQ的帮助下,检索必要的值非常简单。从Cities数组中。在获得与类型对应的字符串并将其存储在typeName变量中之后,可以使用反射返回实际的Type对象,而不仅仅是返回字符串,如上所述。 GetType()方法还具有几个值得一看的重载,它们使您可以配置如果找不到具有给定名称的类型,以及搜索是否应该区分大小写,等等。 )


我希望这个答案对您的情况来说是明确的和有用的,如果您有任何我没有完全回答的问题,请发表评论,我将通过进一步的阐述来更新答案!