如何从XSD生成带显式数值的C#枚举解决xsd.exe值错乱问题
解决方案
针对xsd.exe无法读取XSD中ser:EnumerationValue节点自动生成带赋值枚举的问题,有3种可实现全自动化、无需手动修改生成代码的方案:
方案1:使用T4模板自定义生成逻辑
这是灵活度最高的方案,完全可以按照你的需求输出代码格式,无需依赖第三方工具:
- 在项目中新建T4文本模板,引入
System.Xml.Linq等必要命名空间 - 编写模板逻辑读取XSD文件,解析每个枚举类型下的
xs:enumeration节点,同时提取xs:appinfo下的EnumerationValue数值 - 按照你需要的格式输出枚举代码,包括
XmlTypeAttribute等特性、枚举项注释、对应数值赋值 - 后续XSD更新时,只需右键执行T4模板的「运行自定义工具」即可重新生成最新代码
方案2:对xsd.exe生成结果做自动后处理
可以复用你现有的xsd.exe生成流程,改造成本最低:
- 保留原有的
xsd.exe /namespace:Demo /language:cs /c demo.xsd生成命令 - 编写一个简单的PowerShell脚本或C#控制台工具,逻辑如下:
- 读取XSD文件,生成「枚举项名称-对应数值」的映射表
- 读取xsd.exe生成的cs文件,遍历枚举项,给每个有对应数值的项拼接
= 数值的赋值语句
- 将「执行xsd.exe」+「执行后处理脚本」两步整合成一个批处理命令,后续XSD变更只需运行一次批处理即可得到符合要求的代码
方案3:更换支持ser:EnumerationValue的代码生成工具
xsd.exe本身设计时就没有处理appinfo下的EnumerationValue节点(该节点是为WCF序列化设计的),你可以换用原生支持该特性的生成工具:
比如开源的XsdCodeGen、商业工具XSD2Code,这类工具可以直接识别XSD中的EnumerationValue定义,自动生成带赋值的枚举,无需额外开发,操作最简单。
补充说明
如果你的枚举值存在不需要显式赋值的项(比如示例中的none),可以在生成逻辑中判断如果没有对应的EnumerationValue节点就不追加赋值语句,完全匹配你给出的预期生成结果。
内容的提问来源于stack exchange,提问作者Marius Bancila
相关产品推荐
相关产品推荐

