2

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

这甚至可能吗?如果可以,我该如何做对?

4

1 回答 1

1

Choice in xsd means you could have one of the different object types declared. And because of that, the xsd.exe generates an object(always named Item) instead of a strong type. See: http://msdn.microsoft.com/en-us/library/sa6z5baz(v=vs.85).aspx. You have to check during run time what the object type is:

ExtendedSearch extendedSearch = null;
SimpleSearch simpleSearch = null;
if(Item is ExtendedSearch)
 extendedSearch = (ExtendedSearch)Item;
else if(Item is SimpleSearch)
 simpleSearch = (SimpleSearch)Item;
于 2015-01-14T18:56:08.443 回答