列挙値を保存しようとすると、設定を保存するWinRTの機能が例外をスローすることが判明しました。MSDNは、「Windowsランタイムを使用したアプリデータへのアクセス」ページで、 「ランタイムデータ型」のみがサポートされていると述べています。
では、どのように列挙型を保存しますか?
列挙値を保存しようとすると、設定を保存するWinRTの機能が例外をスローすることが判明しました。MSDNは、「Windowsランタイムを使用したアプリデータへのアクセス」ページで、 「ランタイムデータ型」のみがサポートされていると述べています。
では、どのように列挙型を保存しますか?
それは本当に奇妙な行動です。しかし、簡単に解決できます。
まず、次のような解析ルーチンが必要です。
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;
}
使用例
// write
Write("Color", MyColors);
// read
MyColor value;
TryRead<MyColor>("Color", out value)