我想创建一个自定义配置部分来处理这样的 webcfg
<reports>
<report name="abc">
<query name="que">
<parameter name="def" value="asd" type="string"> </parameter>
<parameter name="par" value="123" type="int"> </parameter>
</query>
</report>
<report name="abc">
<query name="que">
<parameter name="def" value="asd" type="string"> </parameter>
<parameter name="par" value="123" type="int"> </parameter>
</query>
</report>
</reports>
其中“reports”可能有很多“report”标签,“query”可能有很多“parameter”标签。其他一切都应该只出现一次。
所以我创建了以下类结构:
- 报告部分
- 报表元素集合
- 报告元素
- 查询元素
- 参数元素集合
- 参数元素
这是代码:
报告部分:
public class ReportSection : ConfigurationSection
{
// Create a "report" element.
[ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)]
[ConfigurationCollection(typeof(ReportElementCollection), AddItemName = "report")]
public ReportElementCollection Instances
{
get
{
return (ReportElementCollection)this[""];
}
}
public List<Report> GetAllValues()
{
List<Report> reports = new List<Report>();
foreach (ReportElement tags in (ReportElementCollection)this[""])
{
Report r = new Report(tags.Name, tags.Query.Name);//, tags.Query.Parameters);
//reports.Add(
reports.Add(r);
}
return reports;
}
}
报告元素集合:
public class ReportElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new ReportElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
//set to whatever Element Property you want to use for a key
return ((ReportElement)element).Name;
}
}
报告元素:
public class ReportElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true)]
public String Name
{
get
{
return (String)this["name"];
}
set
{
this["name"] = value;
}
}
// Create a "query" element.
[ConfigurationProperty("query", IsRequired=true)]
public QueryElement Query
{
get
{
return (QueryElement)this["query"];
}
set
{ this["query"] = value; }
}
}
查询元素:
public class QueryElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true)]
public String Name
{
get
{
return (String)this["name"];
}
set
{
this["name"] = value;
}
}
// Create a "parameter" element.
[ConfigurationProperty("", IsDefaultCollection = true, IsRequired = true)]
public ParameterElementCollection Parameter
{
get
{
return (ParameterElementCollection)this[""];
}
}
}
参数元素集合:
public class ParameterElementCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new ParameterElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
//set to whatever Element Property you want to use for a key
return ((ParameterElement)element).Name;
}
}
参数元素
public class ParameterElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true)]
public String Name
{
get
{
return (String)this["name"];
}
set
{
this["name"] = value;
}
}
[ConfigurationProperty("value", IsRequired = true)]
public String Value
{
get
{
return (String)this["value"];
}
set
{
this["value"] = value;
}
}
[ConfigurationProperty("type", IsRequired = true)]
public String Type
{
get
{
return (String)this["type"];
}
set
{
this["type"] = value;
}
}
}
问题是当程序尝试加载我的自定义部分时,它会一直运行到 QueryElement.Parameter, this[""] 的 count=0。退出该方法后,我收到以下错误消息:
无法识别的元素“参数”。
我正在阅读许多不同的资源,但它们似乎都与我的代码相匹配。我想我错过了一些非常微小的东西。你知道吗?