2008-08-17 17 views

उत्तर

17

एक VB कोड से परिवर्तित स्निपेट को एक निश्चित इयान Horwill एक blog post long ago पर छोड़ दिया ... मैं के बाद से सफलतापूर्वक उत्पादन में इस का उपयोग किया है।

/// <summary> 
    /// Add spaces to separate the capitalized words in the string, 
    /// i.e. insert a space before each uppercase letter that is 
    /// either preceded by a lowercase letter or followed by a 
    /// lowercase letter (but not for the first char in string). 
    /// This keeps groups of uppercase letters - e.g. acronyms - together. 
    /// </summary> 
    /// <param name="pascalCaseString">A string in PascalCase</param> 
    /// <returns></returns> 
    public static string Wordify(string pascalCaseString) 
    {    
     Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])"); 
     return r.Replace(pascalCaseString, " ${x}"); 
    } 

(की आवश्यकता है, 'System.Text.RegularExpressions उपयोग करते हुए;')

इस प्रकार

:

Console.WriteLine(Wordify(ThisIsValueA.ToString())); 

वापसी होगी,

"This Is Value A". 

यह बहुत सरल और असमान बेमानी है विवरण विशेषताओं को प्रदान करने से।

विशेषताएँ केवल तभी उपयोगी होती हैं जब आपको संकेत की एक परत प्रदान करने की आवश्यकता हो (जिसे प्रश्न नहीं पूछा गया था)।

4

मैंने देखा है कि इसके अधिकांश उदाहरणों में आपके विवरण मूल्यों को [विवरण] विशेषताओं के साथ चिह्नित करना और मूल्य और विवरण के बीच "रूपांतरण" करने के प्रतिबिंब का उपयोग करना शामिल है।

http://geekswithblogs.net/rakker/archive/2006/05/19/78952.aspx

2

आप इस लेख पर एक नज़र ले जा सकते हैं:: यहाँ इसके बारे में एक पुराने ब्लॉग पोस्ट है http://www.codeproject.com/KB/cs/enumdatabinding.aspx

यह बाध्यकारी डेटा के बारे में विशेष रूप से है, लेकिन पता चलता है कि enum मूल्यों को सजाने के लिए एक विशेषता का उपयोग करने के और विशेषता के पाठ को पुनर्प्राप्त करने के लिए "GetDescription" विधि प्रदान करता है। अंतर्निहित वर्णन विशेषता का उपयोग करने में समस्या यह है कि उस विशेषता के अन्य उपयोग/उपयोगकर्ता हैं, इसलिए एक संभावना है कि वर्णन प्रकट होता है जहां आप इसे नहीं चाहते हैं। कस्टम विशेषता उस मुद्दे को हल करती है।

4

आप सिस्टम की "विशेषता" कक्षा से प्राप्त कर सकते हैं। अपना खुद का "विवरण" वर्ग बनाने के लिए चयन। इस (here से) की तरह:

using System; 
using System.Reflection; 
namespace FunWithEnum 
{ 
    enum Coolness : byte 
    { 
     [Description("Not so cool")] 
     NotSoCool = 5, 
     Cool, // since description same as ToString no attr are used 
     [Description("Very cool")] 
     VeryCool = NotSoCool + 7, 
     [Description("Super cool")] 
     SuperCool 
    } 
    class Description : Attribute 
    { 
     public string Text; 
     public Description(string text) 
     { 
      Text = text; 
     } 
    } 
    class Program 
    { 
     static string GetDescription(Enum en) 
     { 
      Type type = en.GetType(); 
      MemberInfo[] memInfo = type.GetMember(en.ToString()); 
      if (memInfo != null && memInfo.Length > 0) 
      { 
       object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false); 
       if (attrs != null && attrs.Length > 0) 
        return ((Description)attrs[0]).Text; 
      } 
      return en.ToString(); 
     } 
     static void Main(string[] args) 
     { 
      Coolness coolType1 = Coolness.Cool; 
      Coolness coolType2 = Coolness.NotSoCool; 
      Console.WriteLine(GetDescription(coolType1)); 
      Console.WriteLine(GetDescription(coolType2)); 
     } 
    } 
} 
+2

सिस्टम विशेषता में पहले से उपलब्ध होने पर विवरण विशेषता क्यों बनाएं। कॉम्पोनेंट मॉडल नामस्थान –

0

मुझे अपने एनम मानों को कम स्कोर के साथ परिभाषित करने के लिए सबसे अच्छा लगता है, इसलिए यह ISValueA यह_Is_Value_A होगा, तो आप केवल enumValue.toString() को प्रतिस्थापित कर सकते हैं। ("_", "") जहां enumValue आपकी विविधता है।

10

.म्स पर टॉस्ट्रिंग सी # में अपेक्षाकृत धीमी है, गेटटाइप() के साथ तुलनात्मक। नाम (यह कवर के तहत भी इसका उपयोग कर सकता है)।

यदि आपके समाधान को बहुत तेज़ या अत्यधिक कुशल होने की आवश्यकता है तो आप स्थिर रूपांतरण में अपने रूपांतरणों को कैशिंग करने और वहां से उन्हें देखने के लिए सबसे अच्छे हो सकते हैं।


सी # 3 का लाभ लेने के लिए @ लियोन के कोड का एक छोटा सा अनुकूलन। यह enums के विस्तार के रूप में समझ में आता है - यदि आप उन सभी को अव्यवस्थित नहीं करना चाहते हैं तो आप इसे विशिष्ट प्रकार तक सीमित कर सकते हैं।

public static string Wordify(this Enum input) 
{    
    Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])"); 
    return r.Replace(input.ToString() , " ${x}"); 
} 

//then your calling syntax is down to: 
MyEnum.ThisIsA.Wordify();