0

我想创建一个自定义配置部分来处理这样的 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。退出该方法后,我收到以下错误消息:

无法识别的元素“参数”。

我正在阅读许多不同的资源,但它们似乎都与我的代码相匹配。我想我错过了一些非常微小的东西。你知道吗?

4

1 回答 1

0

我的 webconfig 不正确,正确的是

<query name="que">
         <parameter>
          <add name="def" value="asd" type="string">
          <add name="par" value="123" type="int"> 
        </parameter>
</query>

代替

<query name="que">
         <parameter name="def" value="asd" type="string"> </parameter>
          <parameter name="par" value="123" type="int"> </parameter>
       </query>
于 2013-11-06T15:04:35.220 回答