簡體   English   中英

如何轉換嵌套列表 <object> 嵌套在C#中的object []數組中

[英]How to convert a nested List<object> to nested object[] array in C#

如何構建一個函數,利用該函數可以將嵌套列表有效地轉換為嵌套object []數組?

ps嵌套列表的深度不同。

例如:

public class ProductBindingViewSC
{
    public int ProductID { get; set; }
    public string aName { get; set; }
    public List<Product_SuperType_Info> SuperTypeList { get; set; }
    public List<Product_Image_Info> Product_ImageList { get; set; }
    public List<Product_Property_BindingViewSC> Property1 { get; set; }

}

Property1具有類似於ProductBindingViewSC的結構(它具有字段和List)

我只需要做幾行

List<ProductBindingViewSC> productList =  new GetProductObject().getProductBySomeCondition( 123 );
var productArray = SomeFunction(productList );

要么

ProductBindingViewSC product =  new GetProductObject().getProductById( 345 );
var product = SomeFunction(product );

ProductArray具有與ProductBindingViewSC完全相同的結構,但是所有的List Type都是Array Type。 並且如果List中的對象之一為空,則數組類將在Array中具有一條空對象的記錄。

編輯:問題:我應該如何編寫SomeFunction 我只能想到以非常低效的方式進行循環,而我的方法並不是通用的。 我需要一個可以放入任何對象類型的函數。

就個人而言,我只是手動編寫一個將ProductBindingViewSC逐個成員轉換為ProductArray成員的函數,然后使用List.ToArray()+ Array.ConvertAll()或Linq的.Select()。ToArray()。

你也可以使用反射,甚至做出不太慢得益於開放的財產委托和泛型類型實例化(總之, 一切努力避免低迷的GetValue()),自動地從一種類型轉換為其他的,但是這是一個相當長的故事來解釋。

  • 它涉及到首先編寫一個通用接口ICopyMember<TIn, TOut>公開一個復制方法,而不公開成員的類型。 然后在通用類PropertyCopier<Tin, TOut, TPropIn, TPropOut>中實現此接口,該類使用打開的屬性委托復制成員,並可能稍后對mass-copy函數進行遞歸調用。
  • 下一步將是使用反射動態實例化這些通用類型。 對於一對簡單的類TInTOut ,您應該獲得ICopyMember<TIn, TOut>的集合,每個屬性一個。
  • 這樣,您應該能夠將所有屬性從一個對象復制到下一個對象。 只需編寫一個循環執行此功能的函數即可。 請記住,緩存這些屬性復印機及其集合可能是一個好主意。 使用源對象和目標對象的Type作為鍵將它們保存在一個集合中(如果總是將其復制到同一目標類,則僅將源對象的Type作為鍵)。
productList.ToArray();

順便說一句,List有什么問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM