2010-04-17 20 views
7

CodeDom API kullanarak bir numaralandırma oluşturmak istiyorum. İnternette yeterince araştırdım ve neredeyse hiç kullanılmayan sonuçlar elde ediyorum. Şunu oluşturmak istiyorum ne.NET's CodeDom kullanarak numaralandırma oluşturma

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

ben CodeTypeDeclaration kullanılan ve IsEnum mülkiyet olarak doğru ayarlamak, bir isim yarattı ve Öznitelikler'i var kümesidir.

Şimdi en büyük sorun bedeni nasıl dolduracak? Ben Açıklama özelliklerini üretebilir bu çözüm kullanarak rağmen

Ben

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); 

çalıştı, yolun sonu ; olurdu değil ,

cevap

11

Enum üyeleri alanlardır, bu yüzden kullanmak 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); 
} 

(Bu basitleştirilmiş kodda, Açıklama her zaman üye adıyla aynı olacaktır. ourse, bu farklı olabilir)

fark edebilirsiniz Biraz cilvesi CodeDom son enum değeri sonra bir virgül ekler olmasıdır. desteğine kesin sırayla,

public enum BugTracker { 

    [Description("Bugzilla")] 
    Bugzilla, 

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

Bu C# dili ile izin verilir Bu şekilde üretilen kod senaryoları, insan okuyucusuna biraz garip gelse bile, iyi bir derleme yapacaktır.

+0

Güzel koymak - enemlerin aslında bir tür CodeMemberField olduğu belli değil. Diğer bağlamlarda faydalı bilgiler! –

+0

Anlaşıldı, çok güzel koydu. Bir enum için değerlerin alan olması, büyük olasılıkla sabit bir değere sahip bir statik alanlar kümesi olarak .Net ikili dosyasında depolanma biçiminden kaynaklanır. –

İlgili konular