我正在使用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中检索这些特殊字符。
答案 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
作为标签。如果它不是硬编码我会使用字典,因为它面对更多不能作为标识符的情况下的弹性。