转换为c#对象时,基于字符串的枚举中的Value属性
本文关键字:字符串 枚举 属性 Value 对象 转换 | 更新日期: 2023-09-27 18:22:48
当我在包含以下内容的xsd文件上使用xsd.exe时:
<xsd:simpleType name="Primes">
<xsd:restriction base="xsd:string">
<xsd:length value="3"/>
<xsd:enumeration value="2" />
<xsd:enumeration value="3" />
<xsd:enumeration value="5" />
<xsd:enumeration value="7" />
<xsd:enumeration value="11" />
<xsd:enumeration value="13" />
<xsd:enumeration value="17" />
</xsd:restriction>
</xsd:simpleType>
生成以下枚举类型:
public enum Primes {
[System.Xml.Serialization.XmlEnumAttribute("2")]
Item2,
[System.Xml.Serialization.XmlEnumAttribute("3")]
Item3,
[System.Xml.Serialization.XmlEnumAttribute("5")]
Item5,
[System.Xml.Serialization.XmlEnumAttribute("7")]
Item7,
[System.Xml.Serialization.XmlEnumAttribute("11")]
Item11,
[System.Xml.Serialization.XmlEnumAttribute("13")]
Item13,
[System.Xml.Serialization.XmlEnumAttribute("17")]
Item17,
}
但当我验证XMl时,它会生成错误消息:
{"实例验证错误:'17'不是Primes的有效值。"}
可能是因为她正在等待值"Item17"。那么,我如何选择值17而不是Item17呢?
仅仅将Item17更改为17 是行不通的
这里的问题是您试图为C#enum
值使用非法标识符。这是不合法的,也是你在这里遇到问题的根源。这里的简单修复方法是在XML和C#代码中使枚举的值成为合法的C#标识符。例如,处处使用Item17
,而不是使用17
。然后编写一个助手函数,将enum
值转换为您想要的数值
static int GetNumber(Primes p) {
switch (p) {
case Primes.Item2: return 2;
case Primes.Item3: return 3;
...
case Primes.Item17: return 17;
default:
// Handle bad data, probably throw
throw new ArgumentInvalidException();
}
}
Ok找到了解决方案:
只需给项目一个正确的值:
public enum Primes
{
[System.Xml.Serialization.XmlEnumAttribute("2")]
Item2 = 2,
[System.Xml.Serialization.XmlEnumAttribute("3")]
Item3 = 3,
[System.Xml.Serialization.XmlEnumAttribute("5")]
Item5 = 5,
[System.Xml.Serialization.XmlEnumAttribute("7")]
Item7 = 7,
[System.Xml.Serialization.XmlEnumAttribute("11")]
Item11 = 11,
[System.Xml.Serialization.XmlEnumAttribute("13")]
Item13 = 13,
[System.Xml.Serialization.XmlEnumAttribute("17")]
Item17 = 17,
}
我相信他的解决方案更好,因为这样你就可以像使用普通枚举一样在"客户端"使用枚举了。例如:
(Primes)Enum.Parse(typeof(Primes), dbreader["col_enum"].ToString())
prints out >> 2 instead of item2
考虑一下,当您使用xsd.exe从xsd创建C#对象时,默认情况下,这是处理xml中整数枚举类型的方式。