2012-01-13 64 views
15

我使用Enterprise Architect從this schema生成業務對象。我怎樣才能得到枚舉包含破折號( - )?

該模式具有以下列舉規格:

<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斯頓茨答案我能找到this article這讓我檢索枚舉這些特殊字符。

+0

可以將它更改爲下劃線? – Marnix 2012-01-13 14:46:55

+0

@Marnix:我想不會。這是一個OGC標準,我想我需要像架構所說的那樣。 – capdragon 2012-01-13 14:48:36

回答

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 2012-01-13 14:55:01

+0

可你請張貼的字典或列表版本的示例代碼? – capdragon 2012-01-13 14:56:57

+0

其實,我只會去描述。 – capdragon 2012-01-13 15:02:30

6

簡短的回答:第

其原因是在於-字符被用作標記由詞法分析器用於其他目的,例如表示二元和一元減法運算符。

你最好的選擇是要麼刪除-或與其他一些字符在標識符名稱的有效字符替換它。您通常可以使用的唯一非字母字符是_

您可以找到C# Specification的更多信息。

1

A C#標識符必須以下劃線,以Unicode類路中,L1,LT,LM,羅,或NL的字符,或用於那些之一的逃逸啓動。所有其他字符必須來自Unicode類Lu,Ll,Lt,Lm,Lo,Nl,Mn,Mc,Nd,Pc或Cf,或者其中一個字符。

連字號 - 減號是類的Pd。

如果C#也允許的話,你還是不能,如果你需要的是符合CLS使用它在公共標識符,因爲這也不符合其規則。

這是一樣好,因爲你是如何打算區分CD-ROMCD-ROM意在enum一個特定的項目含義與CD爲左手操作數和ROM爲右手操作應用-操作?

如果可能性,列表是硬編碼的,我只是刪除了連字符減號,並有CDROM作爲標籤。如果它不是硬編碼的,我會使用字典,因爲它可以應對更多的情況,即某些東西不能作爲標識符。

+0

我將如何使用字典?如果一本字典完全符合這個模式,你能否編輯你的評論以包含字典版本的代碼? – capdragon 2012-01-13 15:24:40

+0

克雷格是在我之前,在那:) – 2012-01-13 15:26:17