如何使用XSD xs:Choice生成的C#类?赋值与类型判断疑惑
如何使用XSD xs:Choice生成的C#类填充和读取数据
背景
你查阅了数十篇关于XSD的xs:Choice元素的文章,但仍无法理解如何使用Xsd2Code++生成的C#类。以下是对应的XSD定义及生成的C#代码:
XSD定义
<xs:element name="VariantRoads"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="Variant" minOccurs="0"/> <xs:element ref="DepVariant"/> <xs:element ref="ArrVariant"/> </xs:choice> </xs:complexType> </xs:element>
生成的C#类代码
[XmlArrayItemAttribute("ArrVariant", typeof(ArrVariantType), IsNullable = false)] [XmlArrayItemAttribute("DepVariant", typeof(DepVariantType), IsNullable = false)] [XmlArrayItemAttribute("Variant", typeof(VariantType), IsNullable = false)] public object[] VariantRoads { get { return _variantRoads; } set { _variantRoads = value; } }
一、填充VariantRoads数组
不需要提前固定数组长度,直接实例化VariantType、DepVariantType、ArrVariantType的对象并赋值即可,两种常见方式:
方式1:直接初始化数组
BaseRoadType brd = new BaseRoadType(); brd.VariantRoads = new object[] { new VariantType { /* 为VariantType的属性赋值,比如:Id = "V1" */ }, new DepVariantType { /* 为DepVariantType的属性赋值,比如:DepCode = "D001" */ }, new ArrVariantType { /* 为ArrVariantType的属性赋值,比如:ArrCode = "A001" */ } };
方式2:用List动态添加(更灵活)
如果不确定元素数量,推荐用List<object>动态添加后转数组:
BaseRoadType brd = new BaseRoadType(); var variantItems = new List<object>(); // 添加Variant类型实例 variantItems.Add(new VariantType { Id = "V1", Name = "默认路线" }); // 添加DepVariant类型实例 variantItems.Add(new DepVariantType { DepCode = "D001", DepName = "出发地变体" }); // 添加ArrVariant类型实例 variantItems.Add(new ArrVariantType { ArrCode = "A001", ArrName = "目的地变体" }); brd.VariantRoads = variantItems.ToArray();
二、读取并判断元素类型
读取时可以用is关键字进行类型匹配,直接获取强类型对象:
if (brd.VariantRoads != null) { foreach (var item in brd.VariantRoads) { if (item is VariantType variant) { // 处理Variant类型数据 Console.WriteLine($"Variant ID: {variant.Id}, 名称: {variant.Name}"); } else if (item is DepVariantType depVariant) { // 处理DepVariant类型数据 Console.WriteLine($"出发地变体编码: {depVariant.DepCode}, 名称: {depVariant.DepName}"); } else if (item is ArrVariantType arrVariant) { // 处理ArrVariant类型数据 Console.WriteLine($"目的地变体编码: {arrVariant.ArrCode}, 名称: {arrVariant.ArrName}"); } } }
也可以用as关键字转换类型,需要判断是否为null:
var variant = item as VariantType; if (variant != null) { // 处理逻辑 }
内容的提问来源于stack exchange,提问作者sinDizzy
相关产品推荐
相关产品推荐

