【问题标题】:How can i get enum to contain a dash (-)?我怎样才能让枚举包含破折号(-)?
【发布时间】:2012-02-09 18:08:18
【问题描述】:

我正在使用 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,它帮助我从枚举中检索了这些特殊字符。

【问题讨论】:

  • 你能把它改成下划线吗?
  • @Marnix:我认为不会。这是一个 OGC 标准,我认为我需要像架构所说的那样拥有它。

标签: c# .net code-generation


【解决方案1】:

你不能。句号。但是,有一些解决方法。例如,您可以使用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"];

【讨论】:

  • 如果我使用字典或列表,那对模式仍然“真实”吗?
  • 你能发布字典或列表版本的示例代码吗?
  • 其实,我只是去描述。
  • 好吧,我还是添加了一个字典示例。
  • 太棒了!谢谢,嗯,现在我被撕裂了。决策决策。
【解决方案2】:

简短回答:不。

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

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

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

【讨论】:

    【解决方案3】:

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

    另一种解决方法是使用XmlEnumAttribute

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

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

    【讨论】:

      【解决方案4】:

      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 作为左手操作数和ROM 作为右手操作数?

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

      【讨论】:

      • 我将如何使用字典?如果字典完全符合架构,您能否编辑您的评论以包含字典版本的代码?
      • 克雷格在这方面领先于我 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多