2009-05-20 10 views
6

HeloCómo obtener el elemento de configuración

¿Alguien me puede explicar cómo obtener el elemento de configuración del archivo .config. Sé cómo manejar atributos pero no elementos. Como ejemplo, quiero analizar siguiente:

<MySection enabled="true"> 

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

<title> .... </title> 

</MySection> 

Mi C# código es el siguiente hasta el momento:

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

Funciona con atributos, ¿cómo lo hago con elementos (propiedad de la cabecera en el código de seguridad) ?

Respuesta

0

Finalmente encontré una manera de hacerlo.

Hay una interfaz IConfigurationSectionHandler que permite las cosas que quiero. Requiere la de escribir el método

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

Tras ello, u PARSE sección por su cuenta, así que pude a buscar XmlElement de sin ningún problema:

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

El lado negativo de esto es esa interfaz está desactualizada pero MSDN afirma que no se eliminará de las versiones futuras de los marcos, ya que se usa internamente.

+1

No especificó a qué versión de .Net pertenece su objetivo. Para todas las versiones anteriores .Net 1.1 y [observación importante] (http://msdn.microsoft.com/en-us/library/system.configuration.iconfigurationsectionhandler (v = vs.110) .aspx) debe decirse: IConfigurationSectionHandler es desaprobado en .NET Framework 2.0 y superior. –

0

Puede utilizar el método ConfigurationManager.GetSection("SectionName") para obtener la sección de configuración en los archivos de configuración.

+1

Está mal. La pregunta es sobre caliente para diseñar secciones de configuración personalizadas. –

4

Aquí es una herramienta de diseñador de sección de configuración personalizada bastante bueno puede utilizar (y es gratis):

Configuration Section Designer

EDIT:

que estaba buscando en MSDN y parece que las secciones de configuración personalizada puede Haz lo que quieras, es decir. obteniendo el valor de configuración de un elemento. Los elementos de configuración personalizados pueden contener otros elementos de configuración, pero los valores de configuración siempre provienen de atributos.

Quizás pueda poner sus fragmentos de html en otros archivos y referirse a ellos desde la configuración, así.

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

Solución fea para mí. ¿Te gustaría configurar el título de la página html y el encabezado de esa manera? :) No lo haría, especialmente porque solo va a tener 1 o pocas líneas (html). Esto elimina los atributos del escenario ya que el usuario no puede usar CDATA con ellos para poder establecer la cadena html. – majkinetor

+0

Bueno, entonces tienes que usar un archivo de configuración personalizado con análisis personalizado. – Vizu

+0

Vizu, 1 voto para el enlace del Diseñador de la sección de configuración. Me ahorró un montón de codificación aburrida allí. Gracias – Liam

0

Según MSDN, en .NET 4 hay una nueva CurrentConfiguration propiedad que le da una referencia al más alto nivel Configuration instancia que representa la jerarquía de configuración que la corriente ConfigurationElement instancia pertenece.

6

Hay otro enfoque para hacer lo mismo.

podríamos crear un elemento anulando DeserializeElement método para obtener valor de cadena:

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

Podría ser mejor utilizar la API 'reader.ReadElementContentAsString()'. –

1

Trabajando con su ejemplo, que se va a anular el Deserialización de "cabecera" en el ConfigurationElement para obtener el valor 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(); 
 
     } 
 
    }

Cuestiones relacionadas