使用EnumMemberAttribute并执行自动字符串转换

我有以下代码

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

我想做以下事情:

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

我已经使用DataContractSerializer完成了第二部分(参见下面的代码),但它似乎做了很多工作。

我错过了一些明显的东西吗 想法? 谢谢。

  public static string ToEnumString(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; } } 

这是我的主张 – 它应该为您提供如何执行此操作的想法(另请参阅获取Enum值的属性 ):

 public static string ToEnumString(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(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); } 

您可以使用reflection来获取EnumMemberAttribute的值。

 public static string ToEnumString(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; } 

根据您的ToEnum工作方式,您可能也希望在那里使用这种方法。 此外,调用ToEnumString时可以推断出类型,例如SerializerHelper.ToEnumString(status);