原因是當您嘗試存儲枚舉值時,WinRT保存設置的功能會引發異常。 MSDN在頁面"Accessing app data with the Windows Runtime"上說只支持"Runtime Data Types"。如何將枚舉保存到ApplicationData.Current.LocalSettings
那麼,你如何保存一個枚舉?
原因是當您嘗試存儲枚舉值時,WinRT保存設置的功能會引發異常。 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());
}
注:一個ENUM的默認值始終是它的值爲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;
}
使用Sample
// write
Write("Color", MyColors);
// read
MyColor value;
TryRead<MyColor>("Color", out value)
爲什麼不枚舉轉換爲整數類型呢? ('ToString()'看起來像是過度殺傷,並且不會在C++項目中起作用。) –
您可以將其轉換爲整數。但是隻有String是100%可靠的,因爲您可以選擇字節,也可以像枚舉的後端類型一樣長。但是如果你知道你的類型,你可以將它轉換爲任何你想要的。如果你確實將它投向了直接來源,那麼你也可能會從中獲益 - 如果這對於這些微不足道的事情來說很重要。 –