2012-05-02 4 views
16

Ho il seguente codiceUso EnumMemberAttribute e fare conversioni di stringhe automatici

[DataContract] 
public enum StatusType 
{ 
    [EnumMember(Value = "A")] 
    All, 
    [EnumMember(Value = "I")] 
    InProcess, 
    [EnumMember(Value = "C")] 
    Complete, 
} 

mi piacerebbe fare quanto segue:

var s = "C"; 
StatusType status = SerializerHelper.ToEnum<StatusType>(s); //status is now StatusType.Complete 
string newString = SerializerHelper.ToEnumString<StatusType>(status); //newString is now "C" 

ho fatto la seconda parte con DataContractSerializer (vedi codice sotto), ma sembra molto lavoro.

Mi manca qualcosa di ovvio? Idee? Grazie.

public static string ToEnumString<T>(T type) 
    { 
     string s; 
     using (var ms = new MemoryStream()) 
     { 
      var ser = new DataContractSerializer(typeof(T)); 
      ser.WriteObject(ms, type); 
      ms.Position = 0; 
      var sr = new StreamReader(ms); 
      s = sr.ReadToEnd(); 
     } 
     using (var xml = new XmlTextReader(s, XmlNodeType.Element, null)) 
     { 
      xml.MoveToContent(); 
      xml.Read(); 
      return xml.Value; 
     } 
    } 
+1

Ho come questa opzione perché estende Enum: http: // StackOverflow. com/a/4367868/1243316 –

risposta

26

Ecco la mia proposta - dovrebbe dare l'idea su come fare questo (controllare anche Getting attributes of Enum's value):

public static string ToEnumString<T>(T type) 
{ 
    var enumType = typeof (T); 
    var name = Enum.GetName(enumType, type); 
    var enumMemberAttribute = ((EnumMemberAttribute[])enumType.GetField(name).GetCustomAttributes(typeof(EnumMemberAttribute), true)).Single(); 
    return enumMemberAttribute.Value; 
} 

public static T ToEnum<T>(string str) 
{ 
    var enumType = typeof(T); 
    foreach (var name in Enum.GetNames(enumType)) 
    { 
     var enumMemberAttribute = ((EnumMemberAttribute[])enumType.GetField(name).GetCustomAttributes(typeof(EnumMemberAttribute), true)).Single(); 
     if (enumMemberAttribute.Value == str) return (T)Enum.Parse(enumType, name); 
    } 
    //throw exception or whatever handling you want or 
    return default(T); 
} 
3

È possibile utilizzare la riflessione per ottenere il valore di EnumMemberAttribute.

public static string ToEnumString<T>(T instance) 
{ 
    if (!typeof(T).IsEnum) 
     throw new ArgumentException("instance", "Must be enum type"); 
    string enumString = instance.ToString(); 
    var field = typeof(T).GetField(enumString); 
    if (field != null) // instance can be a number that was cast to T, instead of a named value, or could be a combination of flags instead of a single value 
    { 
     var attr = (EnumMemberAttribute)field.GetCustomAttributes(typeof(EnumMemberAttribute), false).SingleOrDefault(); 
     if (attr != null) // if there's no EnumMember attr, use the default value 
      enumString = attr.Value; 
    } 
    return enumString; 
} 

A seconda di come le vostre ToEnum opere, si potrebbe desiderare di utilizzare questo tipo di approccio anche lì. Inoltre, il tipo può essere dedotto quando si chiama ToEnumString, ad es. SerializerHelper.ToEnumString(status);

Problemi correlati