2012-01-19 13 views
22

Una de las propiedades de configuración que tengo en mi ConfigurationSection es un ENUM. Cuando .net analiza este valor de cadena de enumeración desde el archivo de configuración, se lanzará una excepción si el caso no coincide exactamente..net Configuración personalizada Cómo insensibilizar mayúsculas y minúsculas enum ConfiguraciónProperty

¿Existe la posibilidad de ignorar el caso al analizar este valor?

+4

'Enum.Parse' acepta un valor booleano para indicarle que debe ignorar caso. – Joey

+2

@teddy eso solo ayudará si los miembros de enum también están en mayúsculas ... –

+0

Sí, soy consciente de que Enum.Parse tiene una bandera de ignorar caso. Pero .net analiza esta ConfigurationProperty automáticamente cuando uso ConfigurationPropertyAttribute. – Koda

Respuesta

25

Puede utilizar ConfigurationConverterBase para hacer un convertidor de configuración personalizada, ver http://msdn.microsoft.com/en-us/library/system.configuration.configurationconverterbase.aspx

esto va a hacer el trabajo:

public class CaseInsensitiveEnumConfigConverter<T> : ConfigurationConverterBase 
    { 
     public override object ConvertFrom(
     ITypeDescriptorContext ctx, CultureInfo ci, object data) 
     { 
      return Enum.Parse(typeof(T), (string)data, true); 
     } 
    } 

y luego en su propiedad:

[ConfigurationProperty("unit", DefaultValue = MeasurementUnits.Pixel)] 
[TypeConverter(typeof(CaseInsensitiveEnumConfigConverter<MeasurementUnits>))] 
public MeasurementUnits Unit { get { return (MeasurementUnits)this["unit"]; } } 

public enum MeasurementUnits 
{ 
     Pixel, 
     Inches, 
     Points, 
     MM, 
} 
82

Pruebe con esto:

Enum.Parse(enum_type, string_value, true); 

último conjunto parámetro a true dice ignorar carcasa cadena cuando el análisis.

+2

Esta debería ser la respuesta aceptada. – starbeamrainbowlabs

+0

Definitivamente, ¡esta es la respuesta correcta! –

+4

Lea el comentario de Koda a la pregunta original. Está utilizando ConfigurationPropertyAttribute, que analiza automáticamente en modo sensible a mayúsculas y minúsculas. Enum.Parse no se usa directamente. La respuesta correcta (que hereda de ConfigurationConvertorBase) es la respuesta correcta. –

6

MyEnum.TryParse() tiene un parámetro IgnoreCase, establézcalo verdadero.

http://msdn.microsoft.com/en-us/library/dd991317.aspx

ACTUALIZACIÓN: Definición de la sección de configuración como esto debería funcionar

public class CustomConfigurationSection : ConfigurationSection 
    { 
     [ConfigurationProperty("myEnumProperty", DefaultValue = MyEnum.Item1, IsRequired = true)] 
     public MyEnum SomeProperty 
     { 
     get 
     { 
      MyEnum tmp; 
      return Enum.TryParse((string)this["myEnumProperty"],true,out tmp)?tmp:MyEnum.Item1; 
     } 
     set 
     { this["myEnumProperty"] = value; } 
     } 
    } 
+0

Sí, soy consciente de que Enum.Parse tiene una bandera de ignorar caso. Pero .net analiza esta ConfigurationProperty automáticamente cuando uso ConfigurationPropertyAttribute. – Koda

Cuestiones relacionadas