2010-04-17 4 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

열거 멤버 필드는, 그래서 사용 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); 
} 

(이 간단한 코드에서 설명은 항상 회원 이름과 동일합니다. 실제 코드에서 c ourse을,이 다를 수 있습니다)

당신이 알 수 있습니다 약간의 특질이 된 CodeDom 마지막 열거 값 다음에 쉼표 추가 점이다. 지원에 정확하게 위하여,

public enum BugTracker { 

    [Description("Bugzilla")] 
    Bugzilla, 

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

이는 C# 언어에 의해 허용됩니다 생성 된 코드 시나리오는 이와 유사하며 인간 판독기에 조금 이상하게 보일지라도 잘 컴파일됩니다.

+0

멋지게 넣습니다. 실제로 열거 형은 실제로 CodeMemberField 유형입니다. 다른 상황에서 유용한 정보! –

+0

동의, 매우 멋지게 넣습니다. 열거 형의 값이 필드라는 사실은 .Net 바이너리에 실제로 저장되는 방식, 즉 고정 값이있는 정적 필드 집합으로 인해 발생합니다. –