2012-05-02 4 views
16

मैं है निम्नलिखित कोडEnumMemberAttribute का उपयोग करना और कर स्वत: स्ट्रिंग रूपांतरण

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

मैं निम्न कार्य करना चाहते हैं:

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

मैं DataContractSerializer का उपयोग कर दूसरे भाग किया है (कोड देखें नीचे), लेकिन यह बहुत काम की तरह लगता है।

मैं कुछ स्पष्ट याद आ रही है? विचार? धन्यवाद।

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

मैं इस विकल्प की तरह है। com/एक/4367868/1243316 –

उत्तर

26

यहाँ मेरी प्रस्ताव है - यह आप (यह भी जाँच Getting attributes of Enum's value) ऐसा करने के तरीके पर विचार दे देना चाहिए: http: // stackoverflow क्योंकि यह 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); 
} 
3

आप प्रतिबिंब का उपयोग 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; 
} 

कैसे अपने ToEnum काम करता है, तुम वहाँ के रूप में अच्छी दृष्टिकोण की इस तरह उपयोग करने के लिए चाहते हो सकता है पर निर्भर करता है। साथ ही ToEnumString पर कॉल करते समय टाइप अनुमानित किया जा सकता है, उदा। SerializerHelper.ToEnumString(status);