2009-05-20 22 views
6

HeloSo erhalten Sie das Konfigurationselement

Kann mir jemand erklären, wie man Konfigurationselement aus der .config-Datei erhält. Ich weiß, wie man mit Attributen, aber nicht mit Elementen umgeht. Als Beispiel möchte ich folgendes analysieren: bisher

<MySection enabled="true"> 

<header><![CDATA[ <div> .... </div> ]]></header> 

<title> .... </title> 

</MySection> 

Mein C# Code sieht wie folgt aus:

public class MyConfiguration : ConfigurationSection 
    { 
     [ConfigurationProperty("enabled", DefaultValue = "true")] 
     public bool Enabled 
     { 
      get { return this["enabled"].ToString().ToLower() == "true" ? true : false; } 
     } 

     [ConfigurationProperty("header")] 
     public string header 
     { 
       ??? 
     } 
    } 

Es mit Attributen funktioniert, wie ich (in obigen Code-Header-Eigenschaft) mit Elementen zu tun ?

Antwort

0

Ich habe endlich einen Weg gefunden, es zu tun.

Es gibt IConfigurationSectionHandler Schnittstelle, die Dinge erlaubt, die ich will. Es erfordert die man die Methode

public object Create(object parent, object configContext, XmlNode section) 

Nachdem es zu schreiben, u Abschnitt auf eigene Faust zu analysieren, so war ich in der Lage XmlElement ist, ohne ein Problem zu holen:

 header = s["header"] != null ? s["header"].InnerText : String.Empty; 
     title = s["title"] != null ? s["title"].InnerText : String.Empty; 

Die Kehrseite davon ist, Diese Schnittstelle ist veraltet, aber MSDN gibt an, dass sie nicht aus zukünftigen Versionen der Frameworks entfernt wird, da sie intern verwendet wird.

+1

Sie haben nicht angegeben, welche Version von .Net fw Sie zielen. Für alle Versionen über .Net 1.1 sollte eine [wichtige Anmerkung] (http://msdn.microsoft.com/en-us/library/system.configuration.iconfigurationsectionhandler (v = vs.110) .aspx) gesagt werden: IConfigurationSectionHandler ist veraltet in .NET Framework 2.0 und höher. –

0

Sie können die Methode verwenden, um den Konfigurationsabschnitt in den Konfigurationsdateien abzurufen.

+1

Es ist falsch. Die Frage ist heiß, eine benutzerdefinierte Konfiguration zu entwerfen. –

4

Hier ist ein ziemlich gutes benutzerdefinierte Config-Abschnitt Designer Tool, das Sie (und es ist kostenlos) verwenden können:

Configuration Section Designer

EDIT:

Ich war auf der Suche in MSDN und es scheint, dass Abschnitte benutzerdefinierte config tu was du willst, d. Abrufen des Konfigurationswerts von einem Element. Benutzerdefinierte Konfigurationselemente können andere Konfigurationselemente enthalten, die Konfigurationswerte stammen jedoch immer von Attributen.

Vielleicht können Sie Ihre HTML-Snippets in andere Dateien und verweisen Sie auf sie aus der Konfig, wie folgt.

<MySection enabled="true"> 
    <header filename="myheader.txt" /> 
    <title filename="mytitle.txt" /> 
</MySection> 
+0

Hässliche Lösung für mich. Möchten Sie den HTML-Seitentitel und die Kopfzeile auf diese Weise einrichten? :) Ich würde nicht, vor allem weil es nur 1 oder wenige (html) Zeilen sein wird. Dadurch werden Attribute aus dem Szenario eliminiert, da der Benutzer CDATA nicht verwenden kann, um eine HTML-Zeichenfolge festlegen zu können. – majkinetor

+0

Nun, dann müssen Sie eine benutzerdefinierte Konfigurationsdatei mit benutzerdefinierten Parsing verwenden. – Vizu

+0

Vizu, 1 Stimme für den Designer Link Designer. Er hat mir eine Menge langweiliger Programmierung erspart. Danke – Liam

0

Nach MSDN, in .NET 4 gibt es eine neue CurrentConfiguration Eigenschaft, die Ihnen einen Verweis auf die oberste Ebene Configuration Instanz gibt, die die Konfigurationshierarchie darstellt, die aktuelle ConfigurationElement Instanz gehört.

6

Es gibt einen anderen Ansatz für die gleiche Sache.

Wir könnten ein Element durch zwingende DeserializeElement Methode erstellen String-Wert zu erhalten:

public class EmailTextElement : ConfigurationElement { 

    public string Value { get; private set; } 

    protected override void DeserializeElement(XmlReader reader, bool s) { 
     Value = reader.ReadElementContentAs(typeof(string), null) as string; 
    } 

} 
+1

Es könnte besser sein, 'reader.ReadElementContentAsString()' API zu verwenden. –

1

Arbeiten mit Ihrem Beispiel, werden Sie die Deserialisierung von „Header“ in der Configuration außer Kraft zu setzen, den CDATA Wert zu erhalten.

<MySection enabled="true"> 
 

 
    <header name="foo"><![CDATA[ <div> .... </div> ]]></header> 
 

 
    <title> .... </title> 
 

 
</MySection>

public sealed class HeaderSection: ConfigurationElement { 
 
     private string __Name, __CDATA; 
 

 
     [ConfigurationProperty("name", IsRequired = true)] 
 
     public string Name { 
 
     get { 
 
      return this.__Name; 
 
     } 
 
     set { 
 
      this.__Name = value; 
 
     } 
 
     } 
 

 
     [ConfigurationProperty("value", IsRequired = true)] 
 
     public string Value { 
 
     get { 
 
      return this.__CDATA; 
 
     } 
 
     set { 
 
      this.__CDATA = value; 
 
     } 
 
     } 
 

 
     protected override void DeserializeElement(System.Xml.XmlReader reader, bool s) { 
 
     this.Name = reader.GetAttribute("name").Trim(); 
 
     string cdata = reader.ReadElementContentAs(typeof(string), null) as string; 
 
     this.Value = cdata.Trim(); 
 
     } 
 
    }

Verwandte Themen