在运行时从非泛型列表创建通用列表

时间:2013-05-29 08:04:28

标签: c# list generics inheritance runtime

我有三个班级:

public class BaseEntity
{
 //properties
}

public class Order:BaseEntity
{
 //properties
}

public class Customer:BaseEntity
{
 //properties
}

我也有一个列表可以填充Customer或填写Order s:

IList nongenericList = SomeMethodGetObjects(); //this method return list of customers or list of Orders

有没有办法在运行时检测nongenericList个对象类型并创建适当的通用列表(在运行时)并将nongenericList转换为此创建的通用列表? 例如,如果nongenericList包含订单,它会生成List<Order>,如果nongenericList包含客户,则会生成List<Customer>

5 个答案:

答案 0 :(得分:2)

List<BaseEntity> input= GetData();
foreach(BaseEntity item in input)
{
   if( item is Order)
      // Do Sth;
   else if( item is Customer)
      // Do sth else
}

答案 1 :(得分:1)

IList nonGenericList = ......

List<Customer> genericList = nonGenericList.OfType<Customer>().ToList();

答案 2 :(得分:0)

我认为你需要通过创建不同的列表来做到这一点。如果您愿意,可以一次创建所有列表,也可以检查类型,然后创建基本类型列表。

创建特定类型列表的示例。

List<Order> genericOrderList = nongenericlist.Where(x=>x is Order)

答案 3 :(得分:0)

您可以检查类型,然后将其投射到相关列表中。

  Type type = nongenericList[0].GetType();

    if (type.Equals(typeof(Customer)))
    {
        List<Customer> c = nongenericList.Cast<Customer>().ToList<Customer>();
    }
    else if (type.Equals(typeof(Order)))
    {
        List<Order> c = nongenericList.Cast<Order>().ToList<Order>();
    }

答案 4 :(得分:0)

如果您可以假设列表中的所有项目都属于同一类型:

if (nongenericList.Count == 0) {
  // no items
} else if (nongenericList[0] is Order) {
  List<Order> orders = nongenericList.Cast<Order>();
  // use the list here
} else {
  List<Customer> customers = nongenericList.Cast<Customer>();
  // use the list here
}