열거 형 값을 저장하려고하면 WinRT의 설정 저장 기능이 예외를 throw합니다. MSDN은 "Accessing app data with the Windows Runtime" 페이지에서 "Runtime Data Types" 만 지원한다고 말합니다.열거 형을 ApplicationData.Current.LocalSettings에 저장하는 방법
그래서 열거 형을 어떻게 저장합니까?
열거 형 값을 저장하려고하면 WinRT의 설정 저장 기능이 예외를 throw합니다. MSDN은 "Accessing app data with the Windows Runtime" 페이지에서 "Runtime Data Types" 만 지원한다고 말합니다.열거 형을 ApplicationData.Current.LocalSettings에 저장하는 방법
그래서 열거 형을 어떻게 저장합니까?
정말 이상한 행동입니다. 그러나 쉽게 해결할 수 있습니다.
먼저이 같은 구문 분석 루틴의 몇 가지 유형을 필요
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"]);
을 기본적으로, 우리가 문자열로 변환하고 있습니다.
왜 대신 정수 유형으로 열거를 변환하지
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)
를 직렬화 열거의 기본 형식을 사용하여 해당 목표를 달성하기위한 또 다른 방법은? ('ToString()'은 과장된 것 같고 C++ 프로젝트에서는 작동하지 않습니다. –
정수로 변환 할 수 있습니다. 하지만 열거 형의 백엔드 유형으로 byte와 long을 선택할 수 있기 때문에 String만이 100 % 신뢰할 만합니다. 그러나 당신이 당신의 유형을 안다면, 당신은 그것을 당신이 원하는대로 변환 할 수 있습니다. 직접 소스로 캐스트하면 성능에 도움이 될 수 있습니다. –