我有以下课程:
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)
{
.
}
}
}
如何使用反射继续动态处理该列表,创建新对象并将属性从一个复制到另一个。
感谢您的帮助。
答案 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);
}
}