2009-05-20 4 views
6

HeloCome ottenere l'elemento di configurazione

Qualcuno può spiegarmi come ottenere l'elemento di configurazione dal file .config. So come gestire gli attributi ma non gli elementi. A titolo di esempio, voglio analizzare seguente:

<MySection enabled="true"> 

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

<title> .... </title> 

</MySection> 

Il mio codice C# è simile al seguente finora:

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 
     { 
       ??? 
     } 
    } 

Funziona con gli attributi, come faccio con gli elementi (proprietà di intestazione in codice di cui sopra) ?

risposta

0

Ho finalmente trovato un modo per farlo.

C'è l'interfaccia IConfigurationSectionHandler che consente le cose che voglio. Richiede quello di scrivere il metodo

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

Dopo che, u parsing sezione sul proprio così sono stato in grado di recuperare XmlElement di senza un problema:

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

Il lato negativo di questo è tale interfaccia è obsoleta ma MSDN afferma che non verrà rimosso dalle future versioni dei framework in quanto viene utilizzato internamente.

+1

Non hai specificato quale versione di .Net hai scelto come target. Per tutte le versioni sopra .Net 1.1 un [importante osservazione] (http://msdn.microsoft.com/en-us/library/system.configuration.iconfigurationsectionhandler (v = vs.110) .aspx) dovrebbe essere detto: IConfigurationSectionHandler è deprecato in .NET Framework 2.0 e versioni successive. –

0

È possibile utilizzare il metodo ConfigurationManager.GetSection("SectionName") per ottenere la sezione di configurazione nei file di configurazione.

+1

E 'sbagliato. La domanda riguarda hot per progettare sezioni di configurazione personalizzate. –

4

Ecco un buon strumento di sezione progettista di configurazione personalizzata che si può usare (ed è gratuito):

Configuration Section Designer

EDIT:

stavo guardando in MSDN e sembra che le sezioni di configurazione personalizzato può fare quello che vuoi, cioè. ottenere il valore di configurazione da un elemento. Gli elementi di configurazione personalizzati possono contenere altri elementi di configurazione, ma i valori di configurazione provengono sempre dagli attributi.

Forse è possibile inserire i frammenti di codice html in altri file e fare riferimento ad essi dalla configurazione, in questo modo.

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

Brutta soluzione per me. Vorresti impostare il titolo e l'intestazione della pagina html in questo modo? :) Non lo farei, soprattutto perché saranno solo 1 o poche righe (html). Ciò elimina gli attributi dallo scenario in quanto l'utente non può utilizzare CDATA con essi per poter impostare la stringa html. – majkinetor

+0

Bene, quindi è necessario utilizzare un file di configurazione personalizzato con analisi personalizzata. – Vizu

+0

Vizu, 1 voto per il collegamento Designer sezione di configurazione. Mi ha salvato un sacco di codice noioso lì. Grazie – Liam

0

Secondo MSDN, in .NET 4 c'è un nuovo CurrentConfiguration proprietà che si dà un riferimento al livello superiore Configuration esempio che rappresenta la gerarchia di configurazione che l'attuale ConfigurationElement istanza appartiene.

6

C'è un altro approccio per fare la stessa cosa.

potremmo creare un elemento ridefinendo DeserializeElement metodo per ottenere valore stringa:

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

Potrebbe essere meglio utilizzare l'API 'reader.ReadElementContentAsString()'. –

1

Lavorare con il tuo esempio, si stanno per sovrascrivere la deserializzazione di "header" in ConfigurationElement per ottenere il valore CDATA.

<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(); 
 
     } 
 
    }