2012-01-19 2 views
22

ConfigurationSection에있는 ConfigurationProperty 중 하나가 ENUM입니다. .net이이 enum 문자열 값을 구성 파일에서 구문 분석 할 때 대소 문자가 정확히 일치하지 않으면 예외가 throw됩니다..net 사용자 지정 구성 요소 대/소문자를 구분하지 않는 방법 열거 형을 구문 분석합니다. ConfigurationProperty

이 값을 구문 분석 할 때 대소 문자를 무시하지 않습니까? 이 사용

+4

'Enum.Parse'이 사건을 무시하도록 지시하는 부울을 받아들입니다. – Joey

+2

@teddy 열거 형 멤버가 모두 대문자 인 경우에만 도움이됩니다 ... –

+0

예 Enum.Parse에 ignorecase 플래그가 있음을 알고 있습니다. 하지만 .net은 ConfigurationPropertyAttribute를 사용할 때이 ConfigurationProperty를 자동으로 구문 분석합니다. – Koda

답변

25
당신은 사용자 정의 구성 컨버터를 만들기 위해 ConfigurationConverterBase을 사용할 수 있습니다

,이 일을 할 것입니다 http://msdn.microsoft.com/en-us/library/system.configuration.configurationconverterbase.aspx

를 참조 작동합니다 정의 :

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

하고는 귀하의 재산에 :

[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

시도 : true로

Enum.Parse(enum_type, string_value, true); 

마지막 PARAM 세트는 구문 분석 할 때 문자열의 케이스를 무시하도록 지시합니다.

+2

이것은 허용 된 대답이어야합니다. – starbeamrainbowlabs

+0

틀림없이 이것이 올바른 대답입니다! –

+4

원래 질문에 대한 Koda의 의견을 읽어보십시오. 그것은 대/소문자 구분 모드에서 자동으로 구문 분석하는 ConfigurationPropertyAttribute를 사용합니다. Enum.Parse는 직접적으로 사용되지 않습니다. 허용 된 대답 (ConfigurationConvertorBase에서 상속)은 정답입니다. –

6

MyEnum.TryParse()에는 IgnoreCase 매개 변수가 true로 설정되어 있습니다.

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

UPDATE : 과 같이 구성 섹션은

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

예 Enum.Parse에 ignorecase 플래그가 있음을 알고 있습니다. 하지만 .net은 ConfigurationPropertyAttribute를 사용할 때이 ConfigurationProperty를 자동으로 구문 분석합니다. – Koda