【问题标题】:create a generic list from a non-generic list in run-time在运行时从非泛型列表创建泛型列表
【发布时间】:2013-05-29 08:04:28
【问题描述】:

我有三个班级:

public class BaseEntity
{
 //properties
}

public class Order:BaseEntity
{
 //properties
}

public class Customer:BaseEntity
{
 //properties
}

我还有一个列表,可以用Customers 填充或用Orders 填充:

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

有什么方法可以让我在运行时检测nongenericList 对象类型并创建适当的通用列表(在运行时)并将nongenericList 转换为这个创建的通用列表? 例如,如果nongenericList 包含订单,则生成List<Order>,如果nongenericList 包含客户,则生成List<Customer>

【问题讨论】:

  • 您所说的非泛型List 类是什么?你能提供一个指向它的 MSDN 文档的链接吗?你能提供一个创建一个的代码 sn-p 吗?
  • 你为什么不直接做一个List<BaseEntity>
  • 您至少必须遍历列表,检查每个项目是否属于同一类型。然后,您将创建一个正确类型的新通用列表并将所有元素复制到其中。

标签: c# list generics inheritance runtime


【解决方案1】:
List<BaseEntity> input= GetData();
foreach(BaseEntity item in input)
{
   if( item is Order)
      // Do Sth;
   else if( item is Customer)
      // Do sth else
}

【讨论】:

  • 这似乎比乱用反射更好。
【解决方案2】:
IList nonGenericList = ......

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      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
      }
      

      【讨论】:

        【解决方案5】:

        您可以检查类型,然后将其转换为相关列表。

          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>();
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-07
          • 2010-12-02
          • 1970-01-01
          • 1970-01-01
          • 2020-10-08
          相关资源
          最近更新 更多