2012-01-13 1 views
15

Enterprise Architect를 사용하여 this schema에서 비즈니스 개체를 생성하고 있습니다.어떻게 대시 (-)를 포함하도록 enum을 얻을 수 있습니까?

스키마는 다음과 같은 열거 사양이 있습니다

<xs:simpleType name="PackageMedium"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="NTP"/> 
     <xs:enumeration value="DAT"/> 
     <xs:enumeration value="Exabyte"/> 
     <xs:enumeration value="CD-ROM"/> 
     <xs:enumeration value="DLT"/> 
     <xs:enumeration value="D1"/> 
     <xs:enumeration value="DVD"/> 
     <xs:enumeration value="BD"/> 
     <xs:enumeration value="LTO"/> 
     <xs:enumeration value="LTO2"/> 
     <xs:enumeration value="LTO4"/> 
    </xs:restriction> 
</xs:simpleType> 

엔터프라이즈 아키텍트는 다음과 같은 코드를 생성하지만 Visual Studio에서 대시 좋아하지 않는다 (-) CD-ROM에서 및 컴파일되지 않습니다.

public enum PackageMedium : int { 
    NTP, 
    DAT, 
    Exabyte, 
    CD-ROM, 
    DLT, 
    D1, 
    DVD, 
    BD, 
    LTO, 
    LTO2, 
    LTO4 
} 

이 작업을 수행하려면 어떻게해야합니까? @Craig Stuntz의 답변에 따라


은 내가 나를 열거에서 이러한 특수 문자를 검색하는 데 도움 this article을 찾을 수 있었다.

+0

밑줄로 바꿀 수 있습니까? – Marnix

+0

@ 마 닉스 : 나는 그렇지 않다고 생각합니다. 그것은 OGC 표준, 나는 스키마가 말한 것처럼 그것을 가질 필요가 있다고 생각합니다. – capdragon

답변

13

수 없습니다. 마침표. 그러나 해결 방법이 있습니다. 당신은, 예를 들어, DescriptionAttribute를 사용할 수 있습니다

public enum PackageMedium : int { 
    NTP, 
    DAT, 
    Exabyte, 
    [Description("CD-ROM")] 
    CDROM, 
    DLT, 
    D1, 
    DVD, 
    BD, 
    LTO, 
    LTO2, 
    LTO4 
} 

이것은 당신이 값을 매핑 할 때해야 할 더 많은 일을 가지고, 불행하게도 의미한다. 다른 한편으로는, 그것을 컴파일해야한다. 당신이 마음에 들지 않으면

, 예를 들어, 사전을 다른 해결 방법을 선택 :

var dict = Enum.GetValues(typeof(PackageMedium)) 
       .Cast<PackageMedium>() 
       .Select(v => Tuple.Create(v == PackageMedium.CDROM ? "CD-ROM" : v.ToString(), v)) 
       .ToDictionary(t => t.Item1, t => t.Item2); 

var myEnumVal = dict["CD-ROM"]; 
+0

만약 내가 사전이나리스트와 함께 간다면, 여전히 스키마에 "맞을 것"입니까? – capdragon

+0

그리고 Dictionary 버전이나 List 버전의 예제 코드를 게시 할 수 있습니까? – capdragon

+0

사실, 나는 설명과 함께 갈 것입니다. – capdragon

6

짧은 답변 : 제

존재가 - 문자는 토큰으로 사용되는 것입니다 이유 바이너리 및 단항 마이너스 연산자와 같은 다른 목적을 위해 렉서가 사용합니다.

가장 좋은 방법은 -을 제거하거나 식별자 이름에 유효한 문자 인 다른 문자로 바꾸는 것입니다. 일반적으로 사용할 수있는 유일한 비 문자는 _입니다.

자세한 내용은 C# Specification에서 확인할 수 있습니다.

1

C# 식별자는 밑줄, 유니 코드 클래스 Lu, Ll, Lt, Lm, Lo 또는 Nl의 문자 또는 그 중 하나에 대한 이스케이프로 시작해야합니다. 다른 모든 문자는 Unicode 클래스 Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd, Pc 또는 Cf이거나 그 중 하나의 이스케이프 여야합니다.

하이픈 - 빼기 유형은 Pd입니다.

C#에서 허용하는 경우 CLS 규격을 준수해야하는 경우에도 공용 식별자에서 사용할 수 없으므로 규칙에 맞지 않습니다. 어떻게 오른쪽 피연산자와 같은 왼쪽 피연산자 CDROM으로 - 연산자를 적용하는 의미 CD-ROM에서 enum에서 특정 항목을 의미 CD-ROM을 구별하는 의미로

이는 단지뿐만 아니라인가?

해당 가능성 목록이 하드 코딩 된 경우 하이픈 - 빼기를 제거하고 CDROM을 레이블로 사용합니다. 하드 코딩되지 않은 경우 사전을 사용합니다. 식별자가없는 숫자가 더 많은 경우에도 복원력이 있기 때문입니다.

+0

사전은 어떻게 사용합니까? 사전이 스키마를 모두 충족시키는 경우 사전 버전의 코드를 포함하도록 주석을 편집 해 주시겠습니까? – capdragon

+0

크레이그는 저를 앞서두고 있습니다 :) –

관련 문제