如何在C#</object>中将嵌套的List <object>转换为嵌套的object []数组

时间:2013-04-12 20:01:35

标签: c# arrays list nested-class

如何构建单个函数,以便有效地将嵌套List转换为嵌套对象[]数组?

P.S。嵌套列表的深度各不相同。

例如:

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<ProductBindingViewSC> productList =  new GetProductObject().getProductBySomeCondition( 123 );
var productArray = SomeFunction(productList );

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

ProductArray 具有与 ProductBindingViewSC 完全相同的结构,但所有列表类型都是数组类型。 如果 List 中的某个对象为空,则数组类将在数组中有一条空对象记录。

编辑: 问题:我应该如何编写 SomeFunction 。我只能想到以非常低效的方式循环,而我的不是通用的。我需要一个可以放入任何对象类型的函数。

2 个答案:

答案 0 :(得分:0)

个人而言,我只是手动编写一个函数,按成员将ProductBindingViewSC转换为ProductArray成员,然后使用List.ToArray()+ Array.ConvertAll()或Linq&#39; s .Select() .ToArray()。

你也可以使用反射,甚至可以通过打开属性委托和泛型类型实例化(简而言之,任何来避免缓慢的GetValue())使得慢),自动从一种类型转换为另一种类型,但这是一个很长的故事需要解释。

  • 它涉及首先编写通用接口ICopyMember<TIn, TOut>以公开复制方法,但不包括成员的类型。然后在泛型类PropertyCopier<Tin, TOut, TPropIn, TPropOut>中实现此接口,该类使用open属性委托复制成员,稍后可能会对批量复制函数进行递归调用。
  • 下一步是使用反射动态实例化这些泛型类型。对于一对简单的类TInTOut,您应该获得ICopyMember<TIn, TOut>的集合,每个属性一个。
  • 使用此功能,您应该能够将所有属性从一个对象复制到下一个对象。只需编写一个循环执行此操作的函数。 请记住,缓存这些属性复印机及其集合可能是个好主意。使用Type源和目标对象作为键(或者只是源对象的对象,如果它始终复制到同一目标类),将它们保存在集合中。

答案 1 :(得分:-1)

productList.ToArray();

List,btw有什么问题?