如何将枚举保存到ApplicationData.Current.LocalSettings中

5
2个回答

5

这是一个非常奇怪的行为,但很容易解决。

首先,您需要像这样的某种类型的解析程序:

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"]);

基本上,我们只是将其转换为字符串。

为什么不将枚举器转换为整数类型呢?(在这里使用ToString()似乎有些过度,而且在C++项目中无法工作。) - James McNellis
1
你可以将其转换为整数。不过仅字符串是100%可靠的,因为你也可以选择字节和长整型作为枚举类型的后端类型。但如果你知道类型,你可以将其转换为任何你想要的类型。如果你将其转换为直接源,并且在这个微不足道的事情上性能很重要,那么你可能会受益于性能方面的优势。 - Jerry Nixon

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接