我在我的app.config文件中为Windows窗体应用程序添加了一个自定义部分。我创建了类来扩展配置文件:
CustomFields myCustomFields = (CustomFields)System.Configuration.ConfigurationManager.GetSection("CustomFields");
我指定了部分名称:
<section name="CustomFields" type="Application.Core.CustomFields, ATMCardRequest.Core" allowLocation="true" allowDefinition="Everywhere" />
现在我认为这是问题所在。上面的工作正常,但我需要这部分的很多属性,而不是这样做:
<CustomFields setting1='hello' setting2='world'/>
我这样做:
<CustomFields>
<property name="setting1">hello</property>
<property name="setting2">world</property>
...
</CustomFields>
代码:
/// <summary>
/// Settings file which holds the name of the XML Fields
/// </summary>
public class setting1: ConfigurationSection
{
/// <summary>
/// Name of the setting1 Field
/// </summary>
[ConfigurationProperty("setting1", IsRequired = true)]
public String setting1
{
get
{
return (String)this["setting1"];
}
set
{
this["setting1"] = value;
}
}
/// <summary>
/// Name of the setting2 Field
/// </summary>
[ConfigurationProperty("setting2",IsRequired = true)]
public String setting2
{
get
{
return (String)this["setting2"];
}
set
{
this["setting2"] = value;
}
}
}
}
哪个不行。显然它不理解'属性'语法。
任何想法我做错了什么?感谢。
答案 0 :(得分:1)
如果要以这种方式定义您需要的属性:
<CustomFields>
<property name="setting1">hello</property>
<property name="setting2">world</property>
...
</CustomFields>
比每个“property”成为CustomFields的子节点,您的属性现在是这些子节点的属性/值,而不是第一个示例中的CustomFields节点的属性。
如果您有很多属性,并且想要更优雅地设置它们,可以考虑两个选项:
1)对自定义部分使用以下结构(略有更改):
<CustomFields>
<setting1 value="hello"/>
<setting2 value="world"/>
...
</CustomFields>
和以下代码定义用于检索值的属性:
public class CustomFields: ConfigurationSection
{
[ConfigurationProperty("setting1")]
public PropertyElement Setting1
{
get
{
return (PropertyElement)this["setting1"];
}
set
{ this["setting1"] = value; }
}
[ConfigurationProperty("setting2")]
public PropertyElement Setting2
{
get
{
return (PropertyElement)this["setting2"];
}
set
{ this["setting2"] = value; }
}
}
public class PropertyElement : ConfigurationElement
{
[ConfigurationProperty("value", IsRequired = false)]
public String Value
{
get
{
return (String)this["value"];
}
set
{
this["value"] = value;
}
}
}
然后,检索值:
string setting1value = myCustomFields.Setting1.Value;
string setting2value = myCustomFields.Setting2.Value;
有关详细信息,请参阅MSDN上的How to: Create Custom Configuration Sections Using ConfigurationSection。
2)采用程序化方法,而不是依赖属性和反射。在这种情况下,可以使用ConfigurationSection class或IConfigurationSectionHandler。因此,您将可以从代码访问包含自定义部分数据的xml节点,并且可以加载任何类型的XML结构。