【问题标题】:Dilemma with XSD, Generics and C# ClassesXSD、泛型和 C# 类的困境
【发布时间】:2013-05-10 14:26:40
【问题描述】:

我有以下简单的 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”没有像我在该元素的 xsd 文件中设置的那样称为“Search”?

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

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

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

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

【问题讨论】:

    标签: c# xml c#-4.0 xml-parsing xsd


    【解决方案1】:

    选择 xsd 意味着您可以声明不同的对象类型之一。因此,xsd.exe 会生成一个对象(始终命名为 Item)而不是强类型。见: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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2010-11-02
      • 1970-01-01
      • 2019-12-27
      相关资源
      最近更新 更多