2010-04-17 8 views
7

का उपयोग करके गणना बनाना मैं CodeDom API का उपयोग करके एक गणना बनाना चाहता हूं। मैंने इंटरनेट पर पर्याप्त खोज की है और मुझे ऐसे परिणाम मिलते हैं जो किसी भी उपयोग के शायद ही नहीं हैं।.NET के CodeDom

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

public enum bug_tracker_type 
{ 
    [Description("Bugzilla")] 
    Bugzilla, 
    [Description("Debbugs")] 
    Debbugs, 
    [Description("PHP Project Bugtracker")] 
    PHP_Project_Bugtracker, 
    [Description("Google Code")] 
    Google_Code 
} 

मैं CodeTypeDeclaration का इस्तेमाल किया और यह IsEnum संपत्ति के रूप में सच है निर्धारित करते हैं, एक नाम बनाया है, और यह गुण है सेट है।

अब सबसे बड़ी समस्या यह है कि शरीर को कैसे पॉप्युलेट करना है? इस समाधान मैं विवरण गुण उत्पन्न कर सकते हैं का उपयोग कर हालांकि

मैं

CodeTypeMember mem = new CodeTypeMember(); 
mem.Name = WadlSharpUtils.CreateIdentifier(discreteValue.value); 
mem.CustomAttributes.Add(new CodeAttributeDeclaration(discreteValue.value)); 
// enumCandidate is an instance of CodeTypeDeclaration 
enumCandidate.Members.Add(mem); 

की कोशिश की, पंक्ति के अंत ; हो सकता है और नहीं ,

उत्तर

11

Enum सदस्यों क्षेत्र हैं, इसलिए का उपयोग CodeMemberField:

CodeTypeDeclaration type = new CodeTypeDeclaration("BugTracker"); 
type.IsEnum = true; 

foreach (var valueName in new string[] { "Bugzilla", "Redmine" }) 
{ 
    // Creates the enum member 
    CodeMemberField f = new CodeMemberField("BugTracker", valueName); 
    // Adds the description attribute 
    f.CustomAttributes.Add(new CodeAttributeDeclaration("Description", new CodeAttributeArgument(new CodePrimitiveExpression(valueName)))); 

    type.Members.Add(f); 
} 

(इस सरलीकृत कोड में, विवरण हमेशा सदस्य नाम के समान ही होगा। आपके वास्तविक कोड में, सी ourse, इन अलग हो सकता है)

एक छोटी सी मोड़ आप देख सकते हैं कि CodeDom पिछले enum मान के बाद एक अल्पविराम कहते है:। समर्थन करने के लिए ठीक क्रम में,

public enum BugTracker { 

    [Description("Bugzilla")] 
    Bugzilla, 

    [Description("Redmine")] 
    Redmine,       // trailing comma 
} 

यह सी # भाषा ने अनुमति दी है इस तरह जेनरेट-कोड परिदृश्य, और यह ठीक है संकलित करेगा भले ही यह मानव पाठक के लिए थोड़ा अजीब लगे।

+0

अच्छी तरह से डालें - यह विशेष रूप से स्पष्ट नहीं है कि वास्तव में enums CodeMemberField का एक प्रकार है। अन्य संदर्भों में उपयोगी जानकारी! –

+0

सहमत हुए, बहुत अच्छी तरह से रखा। तथ्य यह है कि एक enum के लिए मूल्य फ़ील्ड संभवत: नेट बाइनरी में संग्रहीत तरीके से उत्पन्न होते हैं, स्थिर स्थिरता वाले स्थिर फ़ील्ड के सेट के रूप में। –