2014-02-06 186 views
0

我想構建一個結構的結構來複制由XML序列化創建的結構。基本上以下結構是準確的,當我讀取結構時,我可以訪問具有數組組件的元素,如下所示。c#嵌套數組結構初始化

我不能做的是找出頂層結構中的數組,然後進一步將數組放入結構中的語法。

 GetListResponse newone = new GetListResponse();  // this works 
     newone.marker = "";         // these work 
     newone.count = 1; 
     int x = 0; 
     while (reader.Read())    // This works and is where the data is coming from 
     { 
      newone.orderDetails[x] = new GetListResponseDetails();   // does NOT work! 
      newone.orderDetails[x].order.orderId = Convert.ToInt32(reader[4]); 
      newone.orderDetails[x].order.orderPlacedTime = Convert.ToUInt64(reader[0]); 
      newone.orderDetails[x].order.orderValue = Convert.ToInt32(reader[3]) * Convert.ToDecimal(reader[5]);     
      newone.orderDetails[x].order.ItemDetails[0] = new GetListResponse OrderDetailsItemDetails()[];  // this DOESN'T WORK either 
      newone.orderDetails[x].order.ItemDetails[0].Price = Convert.ToDecimal(reader[5]); 
      newone.orderDetails[x].order.ItemDetails[0].filledQuantity = Convert.ToInt32(reader[3]); 
      newone.orderDetails[x].order.ItemDetails[0].ItemNumber = 0; 
      newone.orderDetails[x].order.ItemDetails[0].orderedQuantity = Convert.ToInt32(reader[3]); 
      x++; 
      } 

***更新這裏是類的定義:

public partial class GetListResponse { 

    private int countField; 

    private string markerField; 

    private GetListResponseDetails[] orderDetailsField; 

    /// <remarks/> 
    public int count { 
     get { 
      return this.countField; 
     } 
     set { 
      this.countField = value; 
     } 
    } 

    /// <remarks/> 
    public string marker { 
     get { 
      return this.markerField; 
     } 
     set { 
      this.markerField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlArrayItemAttribute("OrderDetails", IsNullable=false)] 
    public GetListResponseDetails[] orderDetails { 
     get { 
      return this.orderDetailsField; 
     } 
     set { 
      this.orderDetailsField = value; 
     } 
    } 
} 

和項目的詳細信息:

public partial class GetListResponserDetailsOrder { 


    private string priceTypeField; 


    private GetListResponseDetailsItemDetails[] ItemDetailsField; 


     public GetListResponseDetailsItemDetails [] ItemDetails { 
     get { 
      return this.ItemDetailsField; 
     } 
     set { 
      this.ItemDetailsField = value; 
     } 
    } 


} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class GetListResponseOrderDetailsItemDetails { 

    private long ItemNumberField; 


    private decimal orderedQuantityField; 

    private decimal filledQuantityField; 

    private decimal PriceField; 



} 
+3

'new GetListResponse Details();'這是什麼? C#中沒有這樣的語法。 –

+0

注意:只是爲了澄清 - 作爲「結構的結構」,你實際上是指「類與其他類的列表」,而不是從字面上來看'struct Details' ... –

+0

你能告訴我們你的GetListResponse結構/類看起來像內?這將幫助我們瞭解您的問題。 –

回答

0
new GetListResponse Details(); 

是不是一個有效的構造,而是通過代碼判斷它看起來像orderDetails結構的名稱是細節,所以相反,你應該做的:

new Details(); 

當初始化結構中的對象時,不需要指定結構的名稱。

你可以做的是通過使ItemDetails和ItemDetailsField到像這樣的列表更改GetListResponserDetailsOrder:

public partial class GetListResponserDetailsOrder 
{ 
    private string priceTypeField; 
    private List<GetListResponseDetailsItemDetails> ItemDetailsField; 

    public List<GetListResponseDetailsItemDetails> ItemDetails 
    { 
     get 
     { 
      return this.ItemDetailsField; 
     } 
     set 
     { 
      this.ItemDetailsField = value; 
     } 
    } 
} 

然後改變你的代碼,所以你可以這樣調用構造函數:

GetListResponse newone = new GetListResponse(); 
newone.marker = "";          
newone.count = 1; 

for (int x = 0; reader.Read(); x++) 
{ 
    newone.orderDetails[x] = new Details(); 
    newone.orderDetails[x].order.orderId = Convert.ToInt32(reader[4]); 
    newone.orderDetails[x].order.orderPlacedTime = Convert.ToUInt64(reader[0]); 
    newone.orderDetails[x].order.orderValue = Convert.ToInt32(reader[3]) * Convert.ToDecimal(reader[5]);     
    newone.orderDetails[x].order.ItemDetails = new List<GetListResponseDetailsItemDetails>(); 
    newone.orderDetails[x].order.ItemDetails.Add(new GetListResponseDetailsItemDetails()); 
    newone.orderDetails[x].order.ItemDetails[0].Price = Convert.ToDecimal(reader[5]); 
    newone.orderDetails[x].order.ItemDetails[0].filledQuantity = Convert.ToInt32(reader[3]); 
    newone.orderDetails[x].order.ItemDetails[0].ItemNumber = 0; 
    newone.orderDetails[x].order.ItemDetails[0].orderedQuantity = Convert.ToInt32(reader[3]); 
} 

你仍然可以照常使用剩下的代碼。如果您希望稍後將更多元素添加到列表中,則可以調用.Add(...),或者如果要刪除任何元素,則可以調用.Remove(...)。

+0

如果我建議OrderDetailsItemDetails()[1]出現錯誤:無法將[]用[]指定爲GetListResponseOrderDetailsOrderItemDetails類型的表達式' – SchroedingersCat

+0

好的,您能否向我們展示GetListResponse結構/類的外觀?如果我能看到它的結構,我將能夠給你一個更好的答案。 –

+0

我曾想過將對象創建爲列表<>。這是一個很好的解決方案,但其風險與我無法控制的東西完全匹配,以及我學習和啓動XmlWriter解決方案的事實使得最終的解決方案成爲可能。謝謝您的幫助! – SchroedingersCat

0

我最終使用XmlWriter創建了一個XML文檔並對其進行了序列化。這解決了這個問題。 XmlWriter具有相當快的學習曲線,因此它似乎是生成我需要的結構的最小阻力路徑。我仍然很好奇如何在C#中實例化結構,但是直接的需求得到了滿足。感謝所有的意見和建議。