2013-05-15 77 views
2

我具有以下簡單XSD文件XSD,泛型和C#類:困境與

<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殼牌這樣的:

xsd XMLSchema.xsd /c 

基本上/ c表示生成C#類選自XMLSchema.xsd。

中的類則是這個樣子之一:

[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文件內部的元素?

我的第二個問題是爲什麼是屬性項目類型的對象?我設置了一個選擇我的xsd文件裏面,我想在C#代碼看起來更象這樣:

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

我想總得有一個通用類,只允許我見裏面選擇指定的類型在xsd文件中阻止這是我的例子SimpleSearch和ExtendedSearch。

這是甚至可能的,如果是的話,我該怎麼做對嗎?

回答

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; 
+0

這是正確的。 XSD對泛型一無所知 –