【问题标题】:Configuration Element Collection Section配置元素收集部分
【发布时间】:2011-04-03 05:58:35
【问题描述】:

我想像这样设置一个自定义应用配置元素集合部分

<logSectionGroup>
    <logSection name="Testttt">
        <properties name ="Pride">
           <pathName="TestingLog.txt"/>
           <deleteRetention="100"/>
           <deleteZeroRetention="5"/>
           <wildcard="*.txt"/>
        </properties>
        <properties name ="Adhoc">
           <pathName="blah.txt"/>
           <deleteRetention="70"/>
           <deleteZeroRetention="3"/>
           <wildcard="*.*"/>
        </properties>
    </logSection>
</logSectionGroup>

这可能吗?属性将是配置元素,日志部分将是配置元素集合。问题是,我只看到你可以拥有单个元素的多个实例而不是多个元素。

<Section name="Section1">     
    <Section name="Section1">
        <SubSection name="SubSection1">
            <Item name="Item1" />
            <Item name="Item2" />
        </SubSection>
        <SubSection name="SubSection2">
            <Item name="Item1" />
            <Item name="Item2" />
        </SubSection>
</Section>

当您使用 GetElementKey() 时,您会在上面的示例中返回元素“name”,但是如何返回 4 个不同的元素,例如“pathName”“deleteRetention”等。

这是我对 PropElement 的定义

Public Class PropElement
Inherits ConfigurationElement

<ConfigurationProperty("pathName", IsRequired:=True)> _
Public Property PathName() As String
    Get
        Return CStr(Me("pathName"))
    End Get
    Set(ByVal value As String)
        Me("pathName") = value
    End Set
End Property

<ConfigurationProperty("deleteRetention", DefaultValue:="0", IsRequired:=False)> _
Public Property DeleteRetention() As Integer
    Get
        Return CStr(Me("deleteRetention"))
    End Get
    Set(ByVal value As Integer)
        Me("deleteRetention") = value
    End Set
End Property
<ConfigurationProperty("deleteZeroRetention", DefaultValue:="0", IsRequired:=False)> _
Public Property DeleteZeroRetention() As Integer
    Get
        Return CStr(Me("deleteZeroRetention"))
    End Get
    Set(ByVal value As Integer)
        Me("deleteZeroRetention") = value
    End Set
End Property
<ConfigurationProperty("wildcard", DefaultValue:="*.*", IsRequired:=False)> _
Public Property Wildcard() As String
    Get
        Return CStr(Me("wildcard"))
    End Get
    Set(ByVal value As String)
        Me("wildcard") = value
    End Set
End Property

结束类

【问题讨论】:

    标签: .net vb.net app-config


    【解决方案1】:

    可能有点晚了,但你可能还需要解释。 你不能完全做到这一点,因为 XML 的性质,你需要一个节点名。

    所以&lt;pathName="TestingLog.txt"/&gt; 不是有效的 XML - pathName 是节点名称还是属性名称?

    但是这些可以是属性,所以你会有类似的东西:

    <properties name ="Pride" pathName="TestingLog.txt" deleteRetention="100"  deleteZeroRetention="5" wildcard="*.txt"/>
    

    那么代码应该是这样的(我希望你能读懂 C#,如果没有,请给我留言,我会转换成 VB)。

    public class PropElement : ConfigurationElement
    {
        [ConfigurationProperty("name", IsRequired = true, IsKey = true)]
        public string Name
        {
            get { return (string)this["name"]; }
            set { this["name"] = value; }
        }
    
        [ConfigurationProperty("pathName", IsRequired = true)]
        public string PathName
        {
            get { return (string)this["pathName"]; }
            set { this["pathName"] = value; }
        }
    
        [ConfigurationProperty("deleteRetention", IsRequired = true)]
        public int DeleteRetention
        {
            get { return (int)this["deleteRetention"]; }
            set { this["deleteRetention"] = value; }
        }
    
        [ConfigurationProperty("deleteZeroRetention", IsRequired = true)]
        public int DeleteZeroRetention
        {
            get { return (int)this["deleteZeroRetention"]; }
            set { this["deleteZeroRetention"] = value; }
        }
    
        [ConfigurationProperty("wildcard", IsRequired = true)]
        public string Wildcard
        {
            get { return (string)this["wildcard"]; }
            set { this["wildcard"] = value; }
        }
    }
    

    所有属性都是必需的,但您可以另外标记它们。

    【讨论】:

      【解决方案2】:

      当您使用 GetElementKey() 时,您会在上面的示例中返回元素“name”,但是如何返回 4 个不同的元素,例如“pathName”“deleteRetention”等。

      您需要为每个 &lt;property&gt; 元素指定一个类型,该类型从具有四个属性的 ConfigurationElement 派生(定义为元素本身(即从 ConfigurationElement 派生的每个不同类型的自定义类型 - 否则它们将是属性)和一个字符串(用作集合键)。

      那么在&lt;logSection&gt;的实现中Properties集合可以被标记为默认集合。

      (除了简单的配置结构之外的任何东西都会导致很多类型,但大多数都很容易创建。)

      【讨论】:

      • 您能详细说明一下吗?我已经为 PropElements 添加了我的代码。我不确定您所说的收集密钥等是什么意思。谢谢
      猜你喜欢
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      相关资源
      最近更新 更多