转换为c#对象时基于字符串的枚举中的Value属性

时间:2012-02-07 15:56:58

标签: c# xml xsd

当我在包含这篇文章的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

是行不通的

2 个答案:

答案 0 :(得分:2)

这里的问题是您尝试使用非法标识符来表示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();
  }
}

答案 1 :(得分:1)

好的找到了解决方案:

只需为项目指定正确的值:

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中句柄整数枚举类型的方式。