C# 使用反射强制转换将数据返回到列表
我有以下课程:C# 使用反射强制转换将数据返回到列表,c#,reflection,ienumerable,C#,Reflection,Ienumerable,我有以下课程: public class MyExampleClass { public Prop1 { get; set; } public Prop2 { get; set; } } public MyExampleList { public List<MyClass> { get; set; } } 公共类MyExampleClass { 公共属性1{get;set;} 公共属性2{get;set;} } 公共MyExampleList {
public class MyExampleClass
{
public Prop1 { get; set; }
public Prop2 { get; set; }
}
public MyExampleList
{
public List<MyClass> { get; set; }
}
公共类MyExampleClass
{
公共属性1{get;set;}
公共属性2{get;set;}
}
公共MyExampleList
{
公共列表{get;set;}
}
这些都是例子。我有几个具有相同结构的类和列表
然后是一个静态类,它将使用以下数据处理多个类型列表:
public static WorkerClass
{
public static List<T> GetListFromDb()
{
var list = new List<T>;
/// Do the job
return list;
}
}
公共静态工作类
{
公共静态列表GetListFromDb()
{
var列表=新列表;
///做好这项工作
退货清单;
}
}
然后我在代码的另一个点上进行了反射,我需要读取以下数据:
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)
{
.
}
}
}
公共静态类另一个工人
{
公共静态类DoSomething()
{
Type-typeToUse=Assembly.GetType(“WorkerClass”);
var methodToCall=typeToUse.GetType(“GetListFromDb”);
objectreturnlist=methodToCall.Invoke(null,null);
///
///
///?卡在这里…如何处理每个列表元素和
///动态地将其存储在一个新列表中,将其命名为字符串,而不是类。
///
foreach(返回列表中的var项)
{
.
}
}
}
如何使用反射继续动态处理该列表,创建新对象并将属性从一个对象复制到另一个对象
谢谢您的帮助。如果编译时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...
}
}
更新:
您可以创建与对象相同的列表
类型的另一个实例,如下所示:
Type listType = enumerable.GetType();
IList newList = Activator.CreateInstance(listType) as IList;
if (newList != null)
{
foreach (var item in enumerable)
{
newList.Add(item);
}
}
为什么要在这里使用反射?我建议只使用其他失败的反射。但在这个例子中,我缺少接口。有了界面,你会在几秒钟内解决这个问题。真正的系统要比这个复杂得多。。。所以我真的需要反思一下。