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

cap*_*gon 19 .net c# code-generation

我正在使用Enterprise Architect 从此模式生成业务对象.

该架构具有以下枚举规范:

<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>
Run Code Online (Sandbox Code Playgroud)

企业架构师生成以下代码,但Visual Studio不喜欢CD-ROM中的破折号( - ),也不会编译.

public enum PackageMedium : int {
    NTP,
    DAT,
    Exabyte,
    CD-ROM,
    DLT,
    D1,
    DVD,
    BD,
    LTO,
    LTO2,
    LTO4
}
Run Code Online (Sandbox Code Playgroud)

我能做些什么来完成这项工作?


基于@Craig Stuntz回答我能找到这篇文章,帮助我从Enum中检索这些特殊字符.

Cra*_*ntz 19

你不能.完全停止.但是,有一些解决方法.你可以,例如,使用DescriptionAttribute:

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

遗憾的是,这意味着在映射值时您还有更多工作要做.另一方面,它至少可以编译.

如果您不喜欢,请选择其他解决方法,例如字典:

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"];
Run Code Online (Sandbox Code Playgroud)


Jos*_*ers 6

简答:不.

原因在于,-词法分析器将该字符用作其他目的的标记,例如表示二元和一元减运算符.

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

您可以在C#规范中找到更多信息.