2013-12-16 5 views
9

डेटाबेस के साथ मैं वर्तमान में काम कर रहा हूँ एक varchar क्षेत्र है, और मेरे कोड में मैं की तरह एक गणना करने के लिए संभावित मान मैप करना चाहते हैं:क्या एनम के लिए ToString के मूल्य की गारंटी देना संभव है?

public enum UserStatus 
{ 
    Anonymous, 
    Enrolled, 
    SuperUser 
} 

इस स्तंभ के लिए डेटाबेस स्तर पर, वहाँ पर एक विवश है ,

UserStatus.SuperUser.ToString() 

और वह SuperUser मूल्य होना है और इस मिलकर किया: मुझे करने के लिए

ANONYMOUS 
ENROLLED 
SUPERUSER 

क्या यह संभव है: यह जहां मूल्य हो गया है चींटी और सड़क नीचे पेंच नहीं?

+1

यदि आप कोडबेस के नियंत्रण में हैं, तो निश्चित रूप से आप इसे सुनिश्चित कर सकते हैं। –

+1

['ToUpperInvariant()'] (http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant (v = vs.110) .aspx)? – PoByBolek

+1

आपको इसकी आवश्यकता भी नहीं हो सकती है। आप अपनी एसक्यूएल बोली निर्दिष्ट नहीं करते हैं, लेकिन उनमें से कई टेक्स्ट के लिए डिफ़ॉल्ट रूप से केस-असंवेदनशील हैं, जिसका अर्थ है 'सुपर यूज़र' बाधा को पूरा करेगा। – hvd

उत्तर

6

आप enums के लिए ToString ओवरराइड नहीं कर सकते, बजाय आप बना सकते हैं अपने खुद के Extension Method की तरह:

public static class MyExtensions 
{ 
    public static string ToUpperString(this UserStatus userStatus) 
    { 
     return userStatus.ToString().ToUpper();// OR .ToUpperInvariant 
    } 
} 

और फिर यह फोन की तरह:

string str = UserStatus.Anonymous.ToUpperString(); 
+0

क्या ToUpperInvariant() काम नहीं करेगा? – loyalflow

+0

@ user1361315, यह ऊपरी मामले में संस्कृति-असंवेदनशील रूपांतरण के लिए है। [यह] देखें (http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant (v = vs.110) .aspx) – Habib

+0

खैर मुझे संस्कृति की परवाह नहीं है, यह सिर्फ के लिए है डेटाबेस इसलिए इसे संस्कृति द्वारा किसी भी तरह से नहीं बदला जाना चाहिए। तो तो ToUpperInvariant का उपयोग करें? – loyalflow

7

एक बेहतर समाधान लाभ लेने के लिए हो सकता है DescriptionAttribute:

public enum UserStatus 
{ 
    [Description("ANONYMOUS")] 
    Anonymous, 
    [Description("ENROLLED")] 
    Enrolled, 
    [Description("SUPERUSER")] 
    SuperUser 
} 

फिर उपयोग करें कुछ की तरह:

/// <summary> 
/// Class EnumExtenions 
/// </summary> 
public static class EnumExtenions 
{ 
    /// <summary> 
    /// Gets the description. 
    /// </summary> 
    /// <param name="e">The e.</param> 
    /// <returns>String.</returns> 
    public static String GetDescription(this Enum e) 
    { 
     String enumAsString = e.ToString(); 
     Type type = e.GetType(); 
     MemberInfo[] members = type.GetMember(enumAsString); 
     if (members != null && members.Length > 0) 
     { 
      Object[] attributes = members[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 
      if (attributes != null && attributes.Length > 0) 
      { 
       enumAsString = ((DescriptionAttribute)attributes[0]).Description; 
      } 
     } 
     return enumAsString; 
    } 

    /// <summary> 
    /// Gets an enum from its description. 
    /// </summary> 
    /// <typeparam name="TEnum">The type of the T enum.</typeparam> 
    /// <param name="description">The description.</param> 
    /// <returns>Matching enum value.</returns> 
    /// <exception cref="System.InvalidOperationException"></exception> 
    public static TEnum GetFromDescription<TEnum>(String description) 
     where TEnum : struct, IConvertible // http://stackoverflow.com/a/79903/298053 
    { 
     if (!typeof(TEnum).IsEnum) 
     { 
      throw new InvalidOperationException(); 
     } 
     foreach (FieldInfo field in typeof(TEnum).GetFields()) 
     { 
      DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 
      if (attribute != null) 
      { 
       if (attribute.Description == description) 
       { 
        return (TEnum)field.GetValue(null); 
       } 
      } 
      else 
      { 
       if (field.Name == description) 
       { 
        return (TEnum)field.GetValue(null); 
       } 
      } 
     } 
     return default(TEnum); 
    } 
} 

तो अब आप UserStatus.Anonymous.GetDescription() संदर्भित कर रहे हैं।

बेशक आप हमेशा अपना खुद का DatabaseMapAttribute (या क्या है-आप) बना सकते हैं और अपनी खुद की एक्सटेंशन विधियां बना सकते हैं। फिर आप System.ComponentModel के संदर्भ को मार सकते हैं। पूरी तरह से आपका फोन।

+0

यदि आप इसे 'GetDescription()' के रूप में परिभाषित करते हैं, तो आपको इसे 'GetDescription()' के रूप में भी कॉल करना होगा, 'ToDescription() ':) – hvd

+0

@hvd: अच्छी कॉल। अभी भी एक सोमवार के माध्यम से हो रही है। ;-) –

+2

क्या यह वाकई बेहतर है? कोड की मात्रा से जुड़ाव जो आपको बनाए रखना होगा, मैं हबीब के समाधान को पसंद करूंगा ... – PoByBolek

1

Enum.ToString 4 different formats का समर्थन करता है। मैं इसके लिए जाना चाहूंगा:

UserStatus.SuperUser.ToString("G").ToUpper(); 

"जी" यह सुनिश्चित करता है कि यह आपके enum की स्ट्रिंग प्रस्तुति प्राप्त करने के लिए पहले प्रयास करेगा।

संबंधित मुद्दे