2012-10-05 2 views

답변

4

정말 이상한 행동입니다. 그러나 쉽게 해결할 수 있습니다.

먼저이 같은 구문 분석 루틴의 몇 가지 유형을 필요

T ParseEnum<T>(object value) 
{ 
    if (value == null) 
     return default(T); 
    return (T)Enum.Parse(typeof(T), value.ToString()); 
} 

참고 : 열거의 기본 값은 항상 0 값 회원입니다.

그럼 당신은 이런 식으로 상호 작용할 수 :

var _Settings = ApplicationData.Current.LocalSettings.Values; 

// write 
_Settings["Color"] = MyColors.Red.ToString() 

// read 
return ParseEnum<MyColors>(_Settings["Color"]); 

을 기본적으로, 우리가 문자열로 변환하고 있습니다.

+0

를 직렬화 열거의 기본 형식을 사용하여 해당 목표를 달성하기위한 또 다른 방법은? ('ToString()'은 과장된 것 같고 C++ 프로젝트에서는 작동하지 않습니다. –

+1

정수로 변환 할 수 있습니다. 하지만 열거 형의 백엔드 유형으로 byte와 long을 선택할 수 있기 때문에 String만이 100 % 신뢰할 만합니다. 그러나 당신이 당신의 유형을 안다면, 당신은 그것을 당신이 원하는대로 변환 할 수 있습니다. 직접 소스로 캐스트하면 성능에 도움이 될 수 있습니다. –

1

왜 대신 정수 유형으로 열거를 변환하지

public void Write<T>(string key, T value) 
{ 
    var settings = ApplicationData.Current.LocalSettings; 

    if (typeof(T).GetTypeInfo().IsEnum) 
    { 
     settings.Values[key] = Convert.ChangeType(value, Enum.GetUnderlyingType(typeof(T))); 
     return; 
    } 

    settings.Values[key] = value; 
} 

public bool TryRead<T>(string key, out T value) 
{ 
    var settings = ApplicationData.Current.LocalSettings; 

    object tmpValue; 
    if (settings.Values.TryGetValue(key, out tmpValue)) 
    { 
     if (tmpValue == null) 
     { 
      value = default(T); 
      return true; 
     } 

     if (typeof(T).GetTypeInfo().IsEnum) 
     { 
      value = (T)Enum.ToObject(typeof(T), tmpValue); 
      return true; 
     } 

     if (tmpValue is T) 
     { 
      value = (T) tmpValue; 
      return true; 
     } 
    } 

    value = default(T); 
    return false; 
} 

사용 샘플을 값을

// write 
Write("Color", MyColors); 

// read 
MyColor value; 
TryRead<MyColor>("Color", out value) 
관련 문제