使用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);