【问题标题】:XSD2Code++, from XML enum to C# enum with not sequential valuesXSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举
【发布时间】:2021-06-13 14:12:25
【问题描述】:

我的项目使用 XSD2Code++ 从 XSD 源文件生成大量 C# 类和枚举。 默认情况下,该工具会生成 C# 枚举,如下例所示:

来自 XSD 定义:

<simpleType name ="AccessResultsEnum">
  <restriction base="string">
    <enumeration value="Unknown"/>
    <enumeration value="AccessAuthorized"/>
    <enumeration value="AccessNotAuthorized"/>
  </restriction>
</simpleType>

转为 C# 枚举类型:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "4.2.0.31")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mycompany.it/MyProject/StateValues/")]
public enum AccessResultsEnum
{
    /// <remarks/>
    Unknown,
    
    /// <remarks/>
    AccessAuthorized,
    
    /// <remarks/>
    AccessNotAuthorized,
}

现在,我想用 自定义赋值 生成一个 C# 枚举,如下所示:

public enum AccessResultsEnum
{
    /// <remarks/>
    Unknown = 0,
    
    /// <remarks/>
    AccessAuthorized = 2,
    
    /// <remarks/>
    AccessNotAuthorized = 63,
}

有没有办法使用 XSD2Code++ 实现这一点?

我应该将 enum 保留为目标 C# 类型,但我可以更改 XSD AccessResultsEnum 类型定义。

【问题讨论】:

    标签: c# xml enums deserialization xsd2code


    【解决方案1】:

    通常我用 get/set 来做

        public class Test
        {
            public enum AccessResultsEnum
            {
                /// <remarks/>
                Unknown = 0,
                /// <remarks/>
                AccessAuthorized = 2,
                /// <remarks/>
                AccessNotAuthorized = 63,
            }
            private AccessResultsEnum _AccessResultsEnum { get;set;}
            public string AccessResultsEnum {
                get{ return _AccessResultsEnum.ToString();}
                set{ _AccessResultsEnum =(AccessResultsEnum)Enum.Parse(typeof(AccessResultsEnum), value);}
            }
        }
    

    【讨论】:

    • 感谢您的回答,但这并不能解决我的问题。我的起点是我必须不时更新的 XSD 定义文件。然后从 XML 我自动生成 C# 代码。我正在寻找一种方法来定义 XML 代码,以便 XSD2Code 生成具有自定义值的 C# 枚举,而不仅仅是默认的整数序列。这使我不必为这些枚举编写容易出错的内部映射代码。
    • 代码不就是这样吗?它采用字符串名称并转换为枚举。
    • 我不想将枚举类型转换为/从其字符串表示。 C# 将内部整数值分配给枚举,但您可以在项目名称后使用“=”运算符分配自定义内部 int 值。好吧,我想要实现的是自动生成的 C# 枚举代码为每个元素分配我的整数值,而不是默认的顺序值。例如,这个伪造的 XML &lt;enumeration value="AccessNotAuthorized" intvalue="63"/&gt; 应该生成这个 C# 枚举项 AccessNotAuthorized = 63。如果我澄清了我的目标,请告诉我。
    • c# 只是使用枚举名称,它是一个字符串。唯一需要担心数字的情况是当您导入/导出到使用数字而不是字符串的不同应用程序时。因此,在我上面的代码中使用 Enum.Parse() 是外部接口所需要的。
    • 我的项目是一个使用命名枚举从前端应用程序接收命令的中间件。这些枚举由 XSD2Code 生成,它生成一个基本的 C# 枚举,其内部值从 0 开始。后端应用程序(嵌入式设备)使用 int 值。问题是我必须向/从前端和后端应用程序编写映射代码,这是一个容易出错的情况。所以,我想有一种方法来生成 C# 代码,其中枚举具有我的内部值,这样我就可以在前端和后端应用程序使用的值之间进行 1 对 1 匹配。
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多