Секция сбора элементов конфигурации - PullRequest
0 голосов
/ 24 августа 2010

Я бы хотел настроить секцию сбора элементов конфигурации пользовательского приложения, как это

<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

Конечный класс

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Возможно, немного поздно, но, возможно, вам все еще нужно объяснение.Вы не можете достичь именно этого, поскольку из-за природы XML вам нужно имя узла.

То есть <pathName="TestingLog.txt"/> не является допустимым 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; }
    }
}

Все атрибуты обязательны, но вы можете пометить их иначе.

0 голосов
/ 24 августа 2010

Когда вы используете GetElementKey (), он возвращает элемент «name» в приведенном выше примере, но как бы вы возвращали 4 различных элемента, таких как «pathName», «deleteRetention» и т. Д.

Какой вам нужен тип для каждого <property> элемента, полученного из ConfigurationElement с четырьмя свойствами (определяемыми как сами элементы (т. Е. Пользовательский тип, полученный из ConfigurationElement для каждого отдельного типа & mdash; в противном случае они атрибуты) и одну строку (которую вы используете в качестве ключа коллекции).

Тогда при реализации <logSection> коллекция Properties может быть помечена как коллекция по умолчанию.

(Все, кроме простых структур конфигурации, приводит к множеству типов, но большинство из них легко создавать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...