una totitlecase tipo puede pasar parsear numero mayusculas letras entero convertir conversion como cadena c# enums

c# - totitlecase - Usando EnumMemberAttribute y haciendo conversiones automáticas de cadenas



parsear a entero en c# (2)

Tengo el siguiente código

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

Me gustaría hacer lo siguiente:

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

He hecho la segunda parte usando DataContractSerializer (ver código a continuación), pero parece mucho trabajo.

¿Me estoy perdiendo algo obvio? Ideas? Gracias.

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; } }


Aquí está mi propuesta: debería darle una idea de cómo hacer esto (verifique también Obtener atributos del valor de Enum ):

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); }


Puede utilizar la reflexión para obtener el valor del 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; }

Dependiendo de cómo ToEnum su ToEnum , es posible que también desee utilizar este tipo de enfoque allí. Además, el tipo puede inferirse al llamar a ToEnumString , por ejemplo, SerializerHelper.ToEnumString(status);