使用反射转换返回的数据列表

时间:2014-12-20 20:09:51

标签: c# reflection ienumerable

我有以下课程:

public class MyExampleClass 
{
     public Prop1 { get; set; }
     public Prop2 { get; set; }
}

public MyExampleList
{
     public List<MyClass> { get; set; }
}

这些是例子。我有几个具有相同结构的类和列表。

然后是一个静态类,它将在几个类型列表中使用以下数据:

public static WorkerClass
{
    public static List<T> GetListFromDb()
    {
         var list = new List<T>;

         ///  Do the job

         return list;
    }
}

然后我在另一个代码点进行反思,我需要读取这些数据:

public static class AnotherWorker
{
    public static class DoSomething()
    {
        Type typeToUse = Assembly.GetType("WorkerClass");   
        var methodToCall = typeToUse.GetType("GetListFromDb");

        object returnList = methodToCall.Invoke(null, null);

        ///
        /// 
        /// ?? Stuck here... how to foreach each list element and 
        /// dynamically store it in a new List<class_name>, being class_name a string, not a class.
        ///
        foreach (var item in returnList)
        { 
             .

        }

    }
}

如何使用反射继续动态处理该列表,创建新对象并将属性从一个复制到另一个。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果 T 在编译时未知,则无法创建List<T>的实例。这就是仿制药的目的,实际上是:强力打字。

foreach问题很简单:

object returnList = methodToCall.Invoke(null, null);
IEnumerable enumerable = returnList as IEnumerable;
if (enumerable != null)
{
   foreach (var item in enumerable)
   {
       // do the job with each item...
   }
}

<强>更新

您可以创建与您的对象相同的List<T>类型的另一个实例,如下所示:

Type listType = enumerable.GetType();
IList newList = Activator.CreateInstance(listType) as IList;
if (newList != null)
{
    foreach (var item in enumerable)
    {
        newList.Add(item);
    }
}