2012-09-18 70 views
3

我有EnumMember註釋枚舉便於類似於以下JSON.NET系列化:Enum.ToString()的遵守EnumMemberAnnotation

[DataContract] 
[JsonConverter(typeof(StringEnumConverter))] 
public enum Status 
{ 
    [EnumMember(Value = "NOT_ADMITTED")] 
    NotAdmitted, 
    [EnumMember(Value = "ADMITTED")] 
    Admitted 
} 

現在,我想獨立於JSON.NET系列化我想在遵守數據合同中的EnumMember註釋的情況下將枚舉的實例轉換爲字符串,例如:

aStatusInstance.ToString() == "NOT_ADMITTED"

有什麼建議嗎?謝謝!

更新:我的解決方案

我修改了代碼中公認的答案創建一個擴展方法來檢索EnumMember值:

public static string GetEnumMemberValue(this Enum enumValue) 
    { 
     var type = enumValue.GetType(); 
     var info = type.GetField(enumValue.ToString()); 
     var da = (EnumMemberAttribute[])(info.GetCustomAttributes(typeof(EnumMemberAttribute), false)); 

     if (da.Length > 0) 
      return da[0].Value; 
     else 
      return string.Empty; 
    } 
+1

這是你所需要的 - > http://stackoverflow.com/questions/ 796607 /如何覆蓋-tostring -in -c-sharp-enums – lahsrah

+0

適應的好主意。 – scottmgerstl

回答

4

我會使用描述屬性和裝飾枚舉與EnumMember具有相同的值:

[DataContract] 
    [JsonConverter(typeof(StringEnumConverter))] 
    public enum Status 
    { 
     [EnumMember(Value = "NOT_ADMITTED")] 
     [Description("NOT_ADMITTED")] 
     NotAdmitted, 
     [EnumMember(Value = "ADMITTED")] 
     [Description("ADMITTED")] 
     Admitted 
    } 

您可以使用此代碼片段來分析我噸。這被寫爲枚舉類的擴展:

public static string GetDescription(this Enum enumValue) 
    { 
     Type type = enumValue.GetType(); 
     FieldInfo info = type.GetField(enumValue.ToString()); 
     DescriptionAttribute[] da = (DescriptionAttribute[])(info.GetCustomAttributes(typeof(DescriptionAttribute), false)); 

     if (da.Length > 0) 
      return da[0].Description; 
     else 
      return string.Empty; 
    } 

然後,您可以將其與以下比較:

aStatusInstance.GetDescription() == "NOT_ADMITTED" 
+0

謝謝!我想我會去這個,但修改你的擴展方法來從'EnumMember'屬性中讀取。 – HolySamosa