none
自定义配置问题? RRS feed

  • 问题

  • 配置信息如下:
     <reposeContainer > // ConfigurationSection
      <object name ="objectName" type="objectType"> 
          <constructor name="constructorName"> 
               <arg name ="" type="" value="" ref=""/> 
               <arg name ="" type="" value="" ref=""/>
          </constructor>
      </object>
      <object name ="object1Name" type="object1Type">
          <constructor name="constructor1Name">
               <arg name ="" type="" value="" ref=""/>
               <arg name ="" type="" value="" ref=""/>
            </constructor>
      </object>
      </reposeContainer>

    现在的问题是,在 Element中还有ElementCollection对象的嵌套关系,这里不知道该怎麽处理。如:标签 object 是集合,中有二个属性 name 和 type,在标签下还有 constructor 集合,而且constructor的Element下还有一个 arg 的集合。

    2011年11月18日 10:24

答案

  • 我把XML的层次调整后,修改了部分代码就没问题了,XML层次调整后结果如下:

    <reposeContainer >
        <objects> <!--新增标签-->
          <!--对象类型配置-->
          <object name ="objectName" type="objectType">
            <constructors> <!--新增标签-->
              <!--构造函数配置信息-->
              <constructor name="constructorName">
                <args> <!--新增标签-->
                  <!--参数配置信息-->
                  <arg name ="1" type="" value="" ref=""/>
                  <arg name ="2" type="" value="" ref=""/>
                </args>
              </constructor>
            </constructors>
          </object>
       </objects>
    </reposeContainer>
    


    ObjectElement 代码:

    public class ObjectElement : System.Configuration.ConfigurationElement
        {
            [System.Configuration.ConfigurationProperty("name", IsRequired = true)]
            public string Name
            {
                get { return this["name"].ToString(); }
                set { this["name"] = value; }
            }
    
            [System.Configuration.ConfigurationProperty("type", IsRequired = true)]
            public string Type
            {
                get { return this["type"].ToString(); }
                set { this["type"] = value; }
            }
    
            [ConfigurationProperty("constructors", IsDefaultCollection = false)]
            public ConstructorElementCollection Constructors
            {
                get { return (ConstructorElementCollection)base["constructors"]; }
            }
        }
    


    constructorElement代码:

     public class ConstructorElement : System.Configuration.ConfigurationElement
        {
            [System.Configuration.ConfigurationProperty("name", IsRequired = true, DefaultValue = "DefaultConstructor")]
            public string Name
            {
                get { return this["name"].ToString(); }
                set { this["name"] = value; }
            }
    
             [ConfigurationProperty("args", IsDefaultCollection = false)]
            public ArgElementCollection Args
            {
                get { return (ArgElementCollection)base["args"]; }
            }
        }
    


    2011年11月21日 6:36

全部回复

  • 配置信息如下:
     <reposeContainer > // ConfigurationSection
      <object name ="objectName" type="objectType"> 
          <constructor name="constructorName"> 
               <arg name ="" type="" value="" ref=""/> 
               <arg name ="" type="" value="" ref=""/>
          </constructor>
      </object>
      <object name ="object1Name" type="object1Type">
          <constructor name="constructor1Name">
               <arg name ="" type="" value="" ref=""/>
               <arg name ="" type="" value="" ref=""/>
            </constructor>
      </object>
      </reposeContainer>

    现在的问题是,在 Element中还有ElementCollection对象的嵌套关系,这里不知道该怎麽处理。如:标签 object 是集合,中有二个属性 name 和 type,在标签下还有 constructor 集合,而且constructor的Element下还有一个 arg 的集合。


    你这样做完全对啊,可以的。

    请问你究竟要干什么呢?是读取这些内容还是?


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月20日 2:36
    版主
  • 我是想读取配置文件中的信息,我的代码如下,执行后出现错误:无法识别的特性“name”。请注意特性名称区分大小写。

     ConfigurationiSection 代码:

     

     public class ReposeConfigurationSection : ConfigurationSection
        {
            [ConfigurationProperty("", IsDefaultCollection = true)]
            public ObjectElementCollection Objects
            {
                get { return (ObjectElementCollection)this[""]; }
            }
        }
    

     

    object 标签代码:

     

     public class ObjectElement : System.Configuration.ConfigurationElement
        {
            [System.Configuration.ConfigurationProperty("name", IsRequired = true)]
            public string Name
            {
                get { return this["name"].ToString(); }
                set { this["name"] = value; }
            }
    
            [System.Configuration.ConfigurationProperty("type", IsRequired = true)]
            public string Type
            {
                get { return this["type"].ToString(); }
                set { this["type"] = value; }
            }
    
            [ConfigurationProperty("constructor", IsDefaultCollection = false)]
            [ConfigurationCollection(typeof(ConstructorElementCollection), AddItemName = "constructor")]
            public ConstructorElementCollection Constructors
            {
                get { return (ConstructorElementCollection)base["constructor"]; }
            }
        }
    

     


    objectCollection 代码:

     

    [ConfigurationCollection(typeof(ObjectElement), AddItemName = "object")]
        public class ObjectElementCollection : ConfigurationElementCollection
        {
            protected override ConfigurationElement CreateNewElement()
            {
                return new ObjectElement();
            }
    
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ((ObjectElement)element).Name;
            }
    
            public new ObjectElement this[string name]
            {
                get
                {
                    return (ObjectElement)BaseGet(name);
                }
            }
    
            public new ObjectElement this[int index]
            {
                get
                {
                    return (ObjectElement)BaseGet(index);
                }
            }
        }
    

     


    constructor 标签代码:

     

    public class ConstructorElement : System.Configuration.ConfigurationElement
    {
    [System.Configuration.ConfigurationProperty("name")]
    public string Name
    {
    get { return this["name"].ToString(); }
    set { this["name"] = value; }
    }

    [ConfigurationProperty("arg", IsDefaultCollection = false)]
    [ConfigurationCollection(typeof(ArgElementCollection), AddItemName = "constructor")]
    public ArgElementCollection Args
    {
    get { return (ArgElementCollection)base["arg"]; }
    }
    }

     


    constructorCollection代码:

     

     [System.Configuration.ConfigurationCollection(typeof(ConstructorElement), AddItemName = "constructor")]
        public class ConstructorElementCollection : System.Configuration.ConfigurationElementCollection
        {
            protected override ConfigurationElement CreateNewElement()
            {
                return new ConstructorElement();
            }
    
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ((ConstructorElement)element).Name;
            }
    
            public new ObjectElement this[string name]
            {
                get
                {
                    return (ObjectElement)BaseGet(name);
                }
            }
    
            public new ObjectElement this[int index]
            {
                get
                {
                    return (ObjectElement)BaseGet(index);
                }
            }
        }
    

     


    arg标签代码:

     

    public class ArgElement : System.Configuration.ConfigurationElement
        {
            [System.Configuration.ConfigurationProperty("name", IsRequired = true)]
            public string Name
            {
                get { return this["name"].ToString(); }
                set { this["name"] = value; }
            }
    
            [System.Configuration.ConfigurationProperty("name", IsRequired = false)]
            public string Type
            {
                get { return this["type"].ToString(); }
                set { this["type"] = value; }
            }
    
            [System.Configuration.ConfigurationProperty("name", IsRequired = true)]
            public string Value
            {
                get { return this["value"].ToString(); }
                set { this["value"] = value; }
            }
    
            [System.Configuration.ConfigurationProperty("name", IsRequired = false)]
            public string Ref
            {
                get { return this["ref"].ToString(); }
                set { this["ref"] = value; }
            }
        }
    

     


    argCollection代码:

     

    [System.Configuration.ConfigurationCollection(
            typeof(ArgElement),
            AddItemName = "arg")]
        public class ArgElementCollection : ConfigurationElementCollection
        {
            protected override ConfigurationElement CreateNewElement()
            {
                return new ArgElement();
            }
    
            protected override object GetElementKey(ConfigurationElement element)
            {
                return ((ArgElement)element).Name;
            }
    
            public new ObjectElement this[string name]
            {
                get
                {
                    return (ObjectElement)BaseGet(name);
                }
            }
    
            public new ObjectElement this[int index]
            {
                get
                {
                    return (ObjectElement)BaseGet(index);
                }
            }
        }
    


     


    2011年11月21日 2:03
  • 可以告诉我你究竟要读取那些内容吗?我建议你用XmlDocument或者是XDocument为方便之策。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月21日 2:05
    版主
  • 你写的没问题啊,记得在app.config或web.config头上注册你的section类型,格式为:

    <configSections>

        <section name="reposeContainer " type="reposeContainer的namespace,reposeContainer 的assembly name"/>

    </configSections>

     

    然后就可以通过 ReposeConfigurationSection yourSection = (ReposeConfigurationSection)ConfigurationManager.GetSection("reposeContainer") 取得section,然后就可以读其中的各项配置了


    AndersTan
    2011年11月21日 2:23
  • 配置信息如下:
     <reposeContainer > // ConfigurationSection
      <object name ="objectName" type="objectType"> 
          <constructor name="constructorName"> 
               <arg name ="" type="" value="" ref=""/> 
               <arg name ="" type="" value="" ref=""/>
          </constructor>
      </object>
      <object name ="object1Name" type="object1Type">
          <constructor name="constructor1Name">
               <arg name ="" type="" value="" ref=""/>
               <arg name ="" type="" value="" ref=""/>
            </constructor>
      </object>
      </reposeContainer>

    现在的问题是,在 Element中还有ElementCollection对象的嵌套关系,这里不知道该怎麽处理。如:标签 object 是集合,中有二个属性 name 和 type,在标签下还有 constructor 集合,而且constructor的Element下还有一个 arg 的集合。


    这里给出一个使用XDocument读取各个object的内容的示例代码:

    ver result = from e in XDocument.Load("xxx.xml").Descedants("object")
                 select new
                 {
                    Name = e.Attribute("name").Value,
                    Type = e.Attribute("type").Value,
                    CName = e.Element("constructor").Attribute("name").Value,
                    ………………
                 }
    然后使用foreach进行循环就可以了。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月21日 2:35
    版主
  • 我是想取出app.config中的以下标签的内容,并且想使用。Net 配置系统来实现:

    <object name ="objectName" type="objectType"> 
          <constructor name="constructorName"> 
               <arg name ="" type="" value="" ref=""/> 
               <arg name ="" type="" value="" ref=""/>
          </constructor>
      </object>
      <object name ="object1Name" type="object1Type">
          <constructor name="constructor1Name">
               <arg name ="" type="" value="" ref=""/>
               <arg name ="" type="" value="" ref=""/>
            </constructor>
      </object>
    


    2011年11月21日 2:48
  • 这个是我的配置问题,已经配置了。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="reposeContainer" type="Lixue.ReposeContainer.Config.ReposeConfigurationSection,Lixue.ReposeContainer"/>
      </configSections>
      <!--对象配置信息, configSource 为配置的文件路径及名称-->
      <reposeContainer >
        <!--对象类型配置-->
        <object name ="objectName" type="objectType">
          <!--构造函数配置信息-->
          <constructor name="constructorName">
            <!--参数配置信息-->
            <arg name ="" type="" value="" ref=""/>
            <arg name ="" type="" value="" ref=""/>
          </constructor>
        </object>
        <object name ="object1Name" type="object1Type">
          <!--构造函数配置信息-->
          <constructor  name="constructor1Name">
            <!--参数配置信息-->
            <arg name ="" type="" value="" ref=""/>
            <arg name ="" type="" value="" ref=""/>
          </constructor>
        </object>
      </reposeContainer>
    </configuration>
    


    2011年11月21日 2:49
  • 请看我的回答,我已经回答你了。

    或者你具体说清楚什么叫“取出app.config”以下标签内容?你要把整个以下的内容作为字符串输出?

    <object name ="objectName" type="objectType">
          <constructor name="constructorName">
               <arg name ="" type="" value="" ref=""/>
               <arg name ="" type="" value="" ref=""/>
          </constructor>
      </object>
      <object name ="object1Name" type="object1Type">
          <constructor name="constructor1Name">
               <arg name ="" type="" value="" ref=""/>
               <arg name ="" type="" value="" ref=""/>
            </constructor>
      </object>


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月21日 2:50
    版主
  • 多谢,如果自己分析XML的话就没有问题了。哈哈 我是想了解.Net配置系统,及其使用.Net配置系统会很方便。
    2011年11月21日 2:51
  • 或者是说,我是想实现.NET 配置,能使用如下代码能访问配置文件的数据:

    System.Configuration.Configuration config =
                     ConfigurationManager.OpenExeConfiguration(
                     ConfigurationUserLevel.None);
    
                var cf = config.GetSection("reposeContainer") as ReposeConfigurationSection;
    
                if (cf != null)
                {
                    var objectMarks = cf.Objects;
                    var constructorMarks = cf.Objects[0].Constructors;
                    var argMarks = cf.Objects[0].Constructors[0].Args;
    
                    Debug.WriteLine(cf.Objects.Count);
                }


     


    2011年11月21日 3:30
  • 你都知道怎么调用和配置了,你还有什么问题?
    AndersTan
    2011年11月21日 4:19
  • 因为现在的代码,调用时会出错,我一直没有找到原因,错误如下:

    无法识别的特性“name”。请注意特性名称区分大小写。 (E:\Study\ReposeFramework\ReposeContainer.Test\bin\Debug\ReposeContainer.Test.dll.config line 11)

     

      System.Configuration.Configuration config =
                     ConfigurationManager.OpenExeConfiguration(
                     ConfigurationUserLevel.None);
    
                var cf = config.GetSection("reposeContainer") as ReposeConfigurationSection; // 这里出现异常
    
                if (cf != null)
                {
                    var objectMarks = cf.Objects;
                    var constructorMarks = cf.Objects[0].Constructors;
                    var argMarks = cf.Objects[0].Constructors[0].Args;
    
                    Debug.WriteLine(cf.Objects.Count);
                }
    


    2011年11月21日 5:04
  • 把你完整的代码发过来我看看。直接点击我签名档中的“给我写信”即可。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月21日 5:16
    版主
  • 我看你之前贴出来的代码,好像你把 ArgElement 这个类中的所有属性的特性System.Configuration.ConfigurationProperty上都传'name'了,应该是name,type,value,ref,你改过来看看还报错伐
    AndersTan
    2011年11月21日 5:57
  • 已经发送邮件了,帮忙看看,多谢。
    2011年11月21日 5:59
  • 我把XML的层次调整后,修改了部分代码就没问题了,XML层次调整后结果如下:

    <reposeContainer >
        <objects> <!--新增标签-->
          <!--对象类型配置-->
          <object name ="objectName" type="objectType">
            <constructors> <!--新增标签-->
              <!--构造函数配置信息-->
              <constructor name="constructorName">
                <args> <!--新增标签-->
                  <!--参数配置信息-->
                  <arg name ="1" type="" value="" ref=""/>
                  <arg name ="2" type="" value="" ref=""/>
                </args>
              </constructor>
            </constructors>
          </object>
       </objects>
    </reposeContainer>
    


    ObjectElement 代码:

    public class ObjectElement : System.Configuration.ConfigurationElement
        {
            [System.Configuration.ConfigurationProperty("name", IsRequired = true)]
            public string Name
            {
                get { return this["name"].ToString(); }
                set { this["name"] = value; }
            }
    
            [System.Configuration.ConfigurationProperty("type", IsRequired = true)]
            public string Type
            {
                get { return this["type"].ToString(); }
                set { this["type"] = value; }
            }
    
            [ConfigurationProperty("constructors", IsDefaultCollection = false)]
            public ConstructorElementCollection Constructors
            {
                get { return (ConstructorElementCollection)base["constructors"]; }
            }
        }
    


    constructorElement代码:

     public class ConstructorElement : System.Configuration.ConfigurationElement
        {
            [System.Configuration.ConfigurationProperty("name", IsRequired = true, DefaultValue = "DefaultConstructor")]
            public string Name
            {
                get { return this["name"].ToString(); }
                set { this["name"] = value; }
            }
    
             [ConfigurationProperty("args", IsDefaultCollection = false)]
            public ArgElementCollection Args
            {
                get { return (ArgElementCollection)base["args"]; }
            }
        }
    


    2011年11月21日 6:36
  • 我有个问题,是我的代码实现的问题,还是.NET系统配置的问题,集合必须在一个单一的标签下才行,如之前的代码,如果不增加那些标签,是否也可以实现呀。
    2011年11月21日 6:39
  • 我有个问题,是我的代码实现的问题,还是.NET系统配置的问题,集合必须在一个单一的标签下才行,如之前的代码,如果不增加那些标签,是否也可以实现呀。

    不确定,恐怕只能用我的XmlDocument或者是XDocument逐一遍历了。呵呵
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月21日 6:40
    版主
  • 当然可以,你第一次给出的xml配置可以实现

    参考:http://www.360doc.com/content/10/1206/14/16915_75497645.shtml


    AndersTan
    2011年11月21日 6:48
  • 去研究研究,多谢。
    2011年11月21日 7:44
  • 我对比了一下,你给的资料中XML节点如下:

    Orders------------------------1

        Order----------------------多

            LineItems--------------1

               LineItem-------------多

     

    我的XML节点如下:

    reposeContainer------------1

        Object----------------------多

             Constructor-----------多

                   Arg-----------------多

    会不会是因为这样的问题。
    2011年11月21日 7:52
  • 你的

    <reposeContainer > // ConfigurationSection
         <object name ="objectName" type="objectType">
             <constructor name="constructorName">
                 <arg name ="" type="" value="" ref=""/>
                 <arg name ="" type="" value="" ref=""/>
             </constructor>
         </object>
         <object name ="object1Name" type="object1Type">
             <constructor name="constructor1Name">
                 <arg name ="" type="" value="" ref=""/>
                 <arg name ="" type="" value="" ref=""/>
             </constructor>
         </object>
      </reposeContainer>

    他的

    <orders companyID=""> // ConfigurationSection
        <order number="" amout="">
            <lineItems warehouseNumber="">
                <lineItem number="" descrpiton=""/>
                <lineItem number="" descrpiton=""/>
            </lineItems>
        </order>
    </order>
    <orders companyID="">
        <order number="" amout="">
            <lineItems warehouseNumber="">
                <lineItem number="" descrpiton=""/>
                <lineItem number="" descrpiton=""/>
            </lineItems>
        </order>
    </order>

    跟你要求的是一样的,你再仔细看看。


    AndersTan
    2011年11月21日 8:32
  • 还是有些不同的,如下,他的是order和lineItem节点会重复出现:

    我的XML可能没有描述清楚,object、constructor和arg都是可以重复出现的。

    <reposeContainer > // ConfigurationSection
         <object name ="objectName" type="objectType">
             <constructor name="constructorName">
                 <arg name ="" type="" value="" ref=""/>
                 <arg name ="" type="" value="" ref=""/>
             </constructor>
         </object>
         <object name ="object1Name" type="object1Type">
             <constructor name="constructor1Name">
                 <arg name ="" type="" value="" ref=""/>
                 <arg name ="" type="" value="" ref=""/>
             </constructor>
         </object>
      </reposeContainer>
    


     

    2011年11月22日 2:09