You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:01:01