2012-01-13 36 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