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

发布于 2025-01-03 02:31:06 字数 1269 浏览 0 评论 0原文

当我在包含此片段的 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 是行不通的

when i use xsd.exe on xsd file which contains this piece:

<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>

The following enum type is produced:

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,
}

But when i'm validating XMl, it generates error message:

{"Instance validation error: '17' is not a valid value for Primes."}

Probably because she is waiting for the value "Item17" instead. So how can i pick a value of 17 instead of Item17 ?

It won't work just changing Item17 to 17

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鹿童谣 2025-01-10 02:31:06

这里的问题是您尝试对 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();
  }
}

The problem here is you are trying to use an illegal identifier for a C# enum value. This isn't legal and is the source of your problems here. The simple fix here is to make the values of the enumeration legal C# identifiers in the XML and C# code. For example use Item17 everywhere and not 17. Then write a helper function to convert from the enum values to the numeric ones you desire

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();
  }
}
凉宸 2025-01-10 02:31:06

好的找到了解决方案:

只要给项目一个正确的值:

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

Ok found the solution:

Just give the items a correct value:

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,
}

I belive that his is better solution because then you can use the enums in the "client" side in a same way as normal enums. For example:

(Primes)Enum.Parse(typeof(Primes), dbreader["col_enum"].ToString())  

 prints out >> 2 instead of item2

Consider that when you create a C# object from xsd with xsd.exe, this is by default how the handle integers enum types in xml.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文