按照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
}
最佳答案
我建议将您的代码移到通用类或函数中,将反射移到更高的层次:
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});