2009-07-13 9 views
15

क्या सी # एनम स्थिर में रिक्त स्थान रखने का कोई तरीका है? मैंने पढ़ा है कि आप ऐसा करके VB में यह कर सकते हैं:सी # एनम्स में स्थान

Public Enum EnumWithSpaces 
    ConstantWithoutSpaces 
    [Constant With Spaces] 
End Enum 

... और फिर इसे इस तरह का उपयोग:

Public Sub UsingEnumWithSpaces() 

    Dim foo As EnumWithSpaces = EnumWithSpaces.[Constant With Spaces] 

End Sub 

जो मुझे करने के लिए संकेत मिलता है कि CLR एक enum संभाल कर सकते हैं रिक्त स्थान के साथ।

क्या सी # में ऐसा करने का कोई तरीका है?

उत्तर

36

इस ब्लॉग पोस्ट आप मदद कर सकते हैं:

http://blog.spontaneouspublicity.com/2008/01/17/associating-strings-with-enums-in-c/

लेख से:

लेकिन enums सी # में रिक्त स्थान "नहीं हो सकता आप कहते हैं कि ठीक है। , मुझे सिस्टम का उपयोग करना पसंद है। कॉम्पोनेंट मॉडेल। डिस्क्रिप्शन एट्रिब्यूट पर एक और दोस्ताना विवरण जोड़ने के लिएenum मूल्यों। उदाहरण enum इस तरह फिर से लिखा जा सकता है:

public enum States 
{ 
    California, 
    [Description("New Mexico")] 
    NewMexico, 
    [Description("New York")] 
    NewYork, 
    [Description("South Carolina")] 
    SouthCarolina, 
    Tennessee, 
    Washington 
} 

सूचना है कि मैं जहां कि आइटम प्रदर्शित करता है ToString() संस्करण ठीक वस्तुओं पर विवरण न रखें।

+0

धन्यवाद यहूदा मेरे लिए इसे साफ करने की कोशिश कर रहा है। मुझे सही समय पर देखने की कोशिश कर रहे समय का एक बिल्ली था। –

+2

यह अच्छा होगा अगर ToString स्वचालित रूप से विशेषता का उपयोग करता है। जैसा कि यह खड़ा है, हालांकि, यह सब उपयोगी नहीं है। –

+0

मुझे लगता है कि आप 'ToDescription' एक्सटेंशन विधि के साथ हमेशा' विवरण एट्रिब्यूट 'का उपयोग कर सकते हैं। – cdmckay

9

सीएलआर पहचानकर्ताओं में बिल्कुल किसी भी चरित्र को संभाल सकता है। हालांकि, सी # पहचानकर्ता पात्रों को सीएलएस के तहत उन कानूनी लोगों को प्रतिबंधित करता है, जो अंतरिक्ष नहीं है। वैसे भी VB.NET के लिए जाता है, वैसे - स्क्वायर ब्रैकेट के अंदर रिक्त स्थान VB6 में काम करने के लिए उपयोग किए जाते हैं, लेकिन वे VB.NET में नहीं होते हैं।

+0

क्या वैसे भी आप प्रतिबिंब का उपयोग करके एक enum निरंतर संशोधित कर सकते हैं? – cdmckay

+0

क्या आपका मतलब है संकलित असेंबली लोड करना और एनम नामों को प्रतिस्थापित करने के लिए इसे प्रोसेस करना, या रन-टाइम पर निरंतर संशोधित करना? उत्तरार्द्ध संभव नहीं है; पूर्व है, लेकिन मुझे लगता है कि इसे अलग करने के लिए 'ildasm' का उपयोग करना बहुत आसान होगा, आवश्यकतानुसार नामों को प्रतिस्थापित करें (इसे रेगेक्स के साथ स्वचालित किया जा सकता है), और इसे फिर से एक असेंबली बनाने के लिए' ilasm' का उपयोग करें। वैकल्पिक रूप से, आप पहली बार आईएल में अपना enum घोषित कर सकते हैं, इसे 'ilasm' का उपयोग एक .netmodule में संकलित करने के लिए करें, और फिर उस मॉड्यूल को अपने सी #/वीबी असेंबली में लिंक करें। –

+0

मैं केवल 'विवरण एट्रिब्यूट' का उपयोग कर समाप्त हुआ और फिर एनम तक पहुंचने के लिए अपनी खुद की स्थैतिक कक्षा लिख ​​रहा हूं जैसे 'विवरण एट्रिब्यूट' स्थिरांक थे। – cdmckay

0

आप के साथ विजुअल C# 3.0 या मैं इसे सुविधाजनक बस enum वर्ग का विस्तार करने और रिक्त स्थान इनसेट करने के लिए एक regex का उपयोग जहां आवश्यक करने के लिए मिल गया है ऊपर काम कर रहे हैं:

public static class EnumExtension 
{ 
    public static String ToDisplayString(this Enum e) 
    { 
     Regex regex = new Regex(@"([^\^])([A-Z][a-z$])"); 

     return regex.Replace(e.ToString(), new MatchEvaluator(m => 
     { 
      return String.Format("{0} {1}", m.Groups[1].Value, m.Groups[2].Value); 
     })); 
    } 
} 

सूचना यह आपके काम करने के लिए अनुमति देता है किसी भी enum के साथ हर मूल्य के विवरण जोड़ने के बिना है।

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();