.NET y Configuraciones – Parte 9

Luego de varias semanas de ausencia creo que llego la hora de continuar con nuestra serie (no se preocupen, ya estamos llegando al final).

Converters

Es muy comun encontrarnos con momentos en que necesitamos transformar de un tipo a otro en un archivo de configuracion, por ejemplo, necesitamos transformar de un texto a un enumerador dado sin necesidad de usar la funcion “Enum.Parse”. Bien, para esos menesteres existen lo que en el namespace de Configuration se le llama “converters”, o clases especiales que se encargan de transformar de una representacion a un tipo dado.

System.Configuration viene con varios converters dentro de la cajita, algunos bastante utiles:

CommaDelimitedStringCollectionConverter Transforma de una cadena separada por comas a una coleccion de tipo CommaDelimitedStringCollection
GenericEnumConverter Transforma de una representacion de cadena a un Enum
InfiniteIntConverter Tranforma de un entero de tipo entero ilimitado
InfiniteTimeSpanConverter Un tipo TimeSpan con soporte para representacion al infinito
TimeSpanMinutesConverter Tipo TimeSpan usando minutos
TimeSpanMinutesOrInfiniteConverter Tipo TimeSpan usando minutos con representacion al infinito
TimeSpanSecondsConverter Tipo TimeSpan usando segundos
TimeSpanSecondsOrInfiniteConverter Tipo TimeSpan usando segundos con representacion al infinito
TypeNameConverter Retorna un “Tipo” a partir del nombre del tipo
WhiteSpaceTrimStringConverter Retorna una cadena sin los espacios

Una forma facil de enteder como funciona los converters es facil, simplemente veamos un ejemplo:

using System;
using System.ComponentModel;
using System.Configuration;

namespace ConfigurationSample {
    internal struct ConfigurationConsts {
        public const string Name = "type";
    }

    public class SampleConfigurationSection : ConfigurationSection {
        [ConfigurationProperty(ConfigurationConsts.Name, IsRequired = true)]
        [TypeConverter(typeof(TypeNameConverter))]
        public Type Type {
            get { return base[ConfigurationConsts.Name] as Type; }
            set { base[ConfigurationConsts.Name] = value; }
        }
    }
}

Y bueno, veamos el archivo de configuracion, observen como se usa el nombre del tipo, mientras que en la seccion de configuracion retornamos el tipo (no la cadena que representa el tipo, ven? type safety de "gratis").

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="sample" type="ConfigurationSample.SampleConfigurationSection, ConfigurationSample" />
  </configSections>
  <sample type="ConfigurationSample.SampleTypeStuff, ConfigurationSample" />
</configuration>

Y para probar que todo funciona bien, nada mejor que nuestro "hola mundo"

using System;
using System.Configuration;

namespace ConfigurationSample {
    class Program {
        static void Main(string[] args) {
            var configuration = ConfigurationManager.GetSection(&quot;sample&quot;) as SampleConfigurationSection;
            if (configuration != null) {
                var type = configuration.Type;
                Console.WriteLine("The type name is {0}", type.Name);
                Console.WriteLine("The type's assembly is {0}", type.Assembly);
            }
            Console.ReadLine();
        }
    }
}

Ven? bastante simple :) los leo en la siguiente entrega