我有以下简单的 XSD 文件:
<xs:element name="Search" type="SearchObject"/>
<xs:complexType name="SearchObject">
<xs:choice>
<xs:element name="Simple" type="SimpleSearch"/>
<xs:element name="Extended" type="ExtendedSearch"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="SimpleSearch">
<xs:sequence>
<xs:element name="FirstName" type="xs:string"/>
<xs:element name="LastName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ExtendedSearch">
<xs:sequence>
<xs:element name="FirstName" type="xs:string"/>
<xs:element name="LastName" type="xs:string"/>
<xs:element name="Age" type="xs:int"/>
<xs:element name="Address" type="xs:string"/>
</xs:sequence>
</xs:complexType>
我像这样使用 Visual Studio Shell:
xsd XMLSchema.xsd /c
基本上 /c 代表从 XMLSchema.xsd 生成 C# 类。
然后这些类看起来像这样:
[System.Xml.Serialization.XmlRootAttribute("Search", Namespace="http://tempuri.org/XMLSchema.xsd", IsNullable=false)]
public partial class SearchObject {
private object itemField;
[System.Xml.Serialization.XmlElementAttribute("Extended", typeof(ExtendedSearch))]
[System.Xml.Serialization.XmlElementAttribute("Simple", typeof(SimpleSearch))]
public object Item {
get {
return this.itemField;
}
set {
this.itemField = value;
}
}
}
我的第一个问题是为什么属性“项目”不称为“搜索”,因为我在该元素的 xsd 文件中设置?
我的第二个问题是为什么属性 Item 是 object 类型的?我在我的 xsd 文件中设置了一个选项,我希望 c# 代码看起来更像这样:
public partial class SearchObject<T> where T : SimpleSearch, where T : ExtendedSearch
{
public T Search
{
get ...
set ...
}
}
我想以某种方式有一个泛型类,它只允许我在 xsd 文件的选择块中指定的类型,在我的例子中是 SimpleSearch 和 ExtendedSearch。
这甚至可能吗?如果可以,我该如何做对?