XSD、泛型和 C# 类的困境

2024-05-26

我有以下简单的 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;
        }
    }
}

我的第一个问题是为什么属性“Item”不称为“Search”,因为我在该元素的 xsd 文件中设置了该属性?

我的第二个问题是为什么属性 Item 是 object 类型?我在 xsd 文件中设置了一个选择,我希望 C# 代码看起来更像这样:

public partial class SearchObject<T> where T : SimpleSearch, where T : ExtendedSearch
{
    public T Search
    {
       get ...
       set ...
    }
}

我希望有一个通用类,它只允许我在 xsd 文件中的选择块中指定的类型,在我的例子中是 SimpleSearch 和 ExtendedSearch。

这可能吗?如果是的话我该如何做?


xsd 中的选择意味着您可以声明不同的对象类型之一。因此,xsd.exe 会生成一个对象(始终名为 Item)而不是强类型。看:http://msdn.microsoft.com/en-us/library/sa6z5baz(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/sa6z5baz(v=vs.85).aspx。您必须在运行时检查对象类型是什么:

ExtendedSearch extendedSearch = null;
SimpleSearch simpleSearch = null;
if(Item is ExtendedSearch)
 extendedSearch = (ExtendedSearch)Item;
else if(Item is SimpleSearch)
 simpleSearch = (SimpleSearch)Item;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XSD、泛型和 C# 类的困境 的相关文章

随机推荐