【问题标题】:c# Create generic list dynamically at runtimec# 在运行时动态创建泛型列表
【发布时间】:2016-07-12 21:15:51
【问题描述】:

按照this post 上的示例,我发现了如何动态创建泛型类型列表。 现在,我的问题是我想将未知来源列表中的项目添加到创建的列表 - 有什么方法可以实现吗?

编辑 我从包含业务对象的源列表开始,但我绝对需要正确类型的输出列表,因为下游绑定需要它。

我的非编译代码如下:

IList<object> sourceList; // some list containing custom objects
Type t = typeof(IList).MakeGenericType(sourceList[0].GetType());
IList res = (IList)Activator.CreateInstance(t);
foreach (var item in sourceList) {
    reportDS.Add(item); // obviously does not compile
}

【问题讨论】:

  • 如果将 item 转换为列表类型会发生什么
  • sourceListreportDS 是什么?你知道编译时 it 是什么类型吗?如果不是,为什么不直接使用List&lt;object&gt;
  • 当你真正需要说typeof(List&lt;&gt;)时,你正在使用typeof(IList)
  • sourceListIList&lt;object&gt;,但我需要转换为正确的类型typeof(sourceList[0]),因为该列表上的下游绑定需要列表具有正确的类型...我同意发布以避免这个明显的答案!
  • 那么为什么不直接reportDS = sourceList.Cast&lt;Newtype&gt;()呢?

标签: c# list generic-list


【解决方案1】:

这段代码不起作用有几个原因。

首先,您需要创建一个具体类型的实例。您正在使用非泛型接口 (IList) 并尝试从中创建泛型类型。你需要typeof(List&lt;&gt;)

其次,您正在调用AddItem,这不是IList 上的方法。您需要调用Add,这就是代码无法编译的原因。

这段代码会做你想做的事:

IList<object> sourceList; // some list containing custom objects
Type t = typeof(List<>).MakeGenericType(sourceList[0].GetType());
IList res = (IList)Activator.CreateInstance(t);

foreach(var item in sourceList)
{
    res.Add(item);
}

但是,sourceList[0] 持有正确类型的假设可能会影响您。如果该列表包含与列表中的第一项类型不兼容的对象序列,则任何添加到res 的尝试都将失败。正如评论中提到的,您最好创建一个List&lt;object&gt; 来保存这些项目。

【讨论】:

    【解决方案2】:

    我建议将您的代码移动到泛型类或函数中,将反射移动到更高级别:

    private static List<T> CloneListAs<T>(IList<object> source)
    {
        // Here we can do anything we want with T
        // T == source[0].GetType()
        return source.Cast<T>().ToList();
    }
    

    叫它:

    IList<object> sourceList; // some list containing custom objects
    // sourceList = ...
    
    MethodInfo method = typeof(this).GetMethod("CloneListAs");
    MethodInfo genericMethod = method.MakeGenericMethod(sourceList[0].GetType());
    
    var reportDS = genericMethod.Invoke(null, new[] {sourceList});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多