如何让enum包含短划线( - )?

时间:2012-01-13 14:44:05

标签: c# .net code-generation

我正在使用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 Stuntz回答我能找到this article帮助我从Enum中检索这些特殊字符。

4 个答案:

答案 0 :(得分:18)

你做不到。完全停止。但是,有一些解决方法。例如,您可以使用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"];

答案 1 :(得分:6)

简短回答:不。

原因是词法分析器将-字符用作令牌以用于其他目的,例如表示二元和一元减号运算符。

最好的办法是删除-或将其替换为标识符名称中有效字符的其他字符。您通常可以使用的唯一非字母字符是_

您可以在C# Specification

中找到更多信息

答案 2 :(得分:2)

我知道这已经晚了,但这可能很有用。

另一种解决方法是使用 XmlEnumAttribute :

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

它用于验证带有 xsd 的 xml。不需要额外的代码。

答案 3 :(得分:1)

C#标识符必须以下划线开头,Unicode类Lu,Ll,Lt,Lm,Lo或Nl中的字符,或其中一个字符的转义符。所有其他字符必须来自Unicode类Lu,Ll,Lt,Lm,Lo,Nl,Mn,Mc,Nd,Pc或Cf,或其中之一的转义。

Hyphen-minus属于Pd类。

如果C#允许它,如果你需要符合CLS,你仍然无法在公共标识符上使用它,因为它也不符合它的规则。

这也是一样的,因为你是如何区分CD-ROM意味着enum中的特定项目与CD-ROM意味着将-运算符应用于CD {1}}作为左手操作数,ROM作为右手操作数?

如果可能性列表是硬编码的,我只需删除连字符 - 减号并将CDROM作为标签。如果它不是硬编码我会使用字典,因为它面对更多不能作为标识符的情况下的弹性。