我的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
答案 0 :(得分:1)
您需要参考该部分:
var theSection = (TypeOfSection)ConfigurationManager.GetSection("mySection");
注意转换为TypeOfSection
- 这是在配置文件中声明的类型。
此时,您应该拥有一个可以访问并迭代的强类型对象。
答案 1 :(得分:0)
在我的回答中,我假设您已经编写了一个实现ConfigurationSection的类,该类具有城市集合。 –奥德于2012年11月13日在13:50
虽然我觉得它的细节不够详细,但从技术上讲,以上答案是正确的。我将尝试详细说明@Oded的响应,希望它将是一个清晰的展览!
这里要做的第一件事是实现一个新类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;}
}
在您选择的源代码中创建配置部分,并为该部分命名以符合预期目的,在这种情况下,我们将调用mySection
部分以匹配原始问题。
<mySection>
<Cities>
<city Id="ny" Type="nameSpace1" />
<city Id="dc" Type="nameSpace2" />
<city Id="nj" Type="nameSpace3" />
</Cities>
</mySection>
现在,关键步骤是将MyConfigSection
poco绑定到所需的配置设置部分。我们可以通过将以下代码添加到启动类中而无需通过IOptions<T>
接口来实现此目的:
var configSection = new MyConfigSection();
Configuration.Bind("mySection", configSection);
services.AddSingleton(configSection);
添加绑定并将结果对象注册到服务容器之后,现在可以通过依赖注入通过在任何方法中简单地包括类型为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()
方法还具有几个值得一看的重载,它们使您可以配置如果找不到具有给定名称的类型,以及搜索是否应该区分大小写,等等。 )
我希望这个答案对您的情况来说是明确的和有用的,如果您有任何我没有完全回答的问题,请发表评论,我将通过进一步的阐述来更新答案!