2012-10-05 52 views

回答

4

這是一個非常奇怪的行爲。但容易解決。

首先,你需要某種類型的解析程序的是這樣的:

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

基本上,我們只是將其轉化爲一個字符串。

+0

爲什麼不枚舉轉換爲整數類型呢? ('ToString()'看起來像是過度殺傷,並且不會在C++項目中起作用。) –

+1

您可以將其轉換爲整數。但是隻有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; 
} 

使用Sample

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

// read 
MyColor value; 
TryRead<MyColor>("Color", out value)