5

我的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.

IE

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

2 回答 2

1

您需要参考以下部分:

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

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

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

于 2012-11-13T13:46:48.887 回答
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. 现在关键步骤是将MyConfigSectionpoco 绑定到所需的配置设置部分。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()方法还有几个值得一看的重载,它们允许您配置如果找不到具有给定名称的类型会发生什么,以及搜索是否应该区分大小写等。)


我希望这个答案对您的情况清楚且有用,如果您有任何我没有完全回答的问题,请发表评论,我一定会通过一些额外的阐述来更新答案!

于 2019-04-18T03:43:11.310 回答