如何遍历通过反射的方式获取的集合

hxymiller 2014-08-26 11:29:10
通过传来的参数的dbname来用反射动态创建不同类的实体,再调用实体的GetDataByPage方法获取到list集合,请问各位大神该如何遍历集合list啊,代码如下:
private void CreateText(string dbname)
{
Assembly ass = Assembly.LoadFile("C:\\Users\\otsoftadmin\\Documents\\Visual Studio 2010\\Projects\\IndexFactory\\BLL\\bin\\Debug\\IndexFactory.BLL.dll");
Type t = ass.GetType("IndexFactory.BLL." + dbname + "");
MethodInfo mGetDataByPage = t.GetMethod("GetDataByPage");
MethodInfo mGetRecordCount = t.GetMethod("GetRecordCount");
object obj = Activator.CreateInstance(t);
int rowcount=Convert.ToInt32(mGetRecordCount.Invoke(obj,new object[]{""}));
int pagesize = 1000;
int pagecount = Convert.ToInt32(Math.Ceiling(rowcount * 1.0 / pagesize));
string path = @"E:\PatentLunce\new文本\" + dbname + "\\";
if (rowcount / pagesize == 0)
{
for (int i = 1; i <= 1; i++)
{
var list = mGetDataByPage.Invoke(obj, new object[] { i, 1000 });

using (StreamWriter sw = File.CreateText(path + "" + i + ".txt"))
{
Assembly assmodel = Assembly.LoadFile("C:\\Users\\otsoftadmin\\Documents\\Visual Studio 2010\\Projects\\IndexFactory\\Model\\bin\\Debug\\IndexFactory.Model.dll");
Type tm = assmodel.GetType("IndexFactory.Model." + dbname + "");


foreach ( object model in list)
...全文
343 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxymiller 2014-08-26
  • 打赏
  • 举报
回复
引用 1 楼 a475372067 的回复:
首先你要先知道IndexFactory这个DLL中执行mGetDataByPage.Invoke(obj, new object[] { i, 1000 });得到的是什么?
得到的是List<Model.Asppatent>
hxymiller 2014-08-26
  • 打赏
  • 举报
回复
引用 楼主 hxymiller 的回复:
通过传来的参数的dbname来用反射动态创建不同类的实体,再调用实体的GetDataByPage方法获取到list集合,请问各位大神该如何遍历集合list啊,代码如下: private void CreateText(string dbname) { Assembly ass = Assembly.LoadFile("C:\\Users\\otsoftadmin\\Documents\\Visual Studio 2010\\Projects\\IndexFactory\\BLL\\bin\\Debug\\IndexFactory.BLL.dll"); Type t = ass.GetType("IndexFactory.BLL." + dbname + ""); MethodInfo mGetDataByPage = t.GetMethod("GetDataByPage"); MethodInfo mGetRecordCount = t.GetMethod("GetRecordCount"); object obj = Activator.CreateInstance(t); int rowcount=Convert.ToInt32(mGetRecordCount.Invoke(obj,new object[]{""})); int pagesize = 1000; int pagecount = Convert.ToInt32(Math.Ceiling(rowcount * 1.0 / pagesize)); string path = @"E:\PatentLunce\new文本\" + dbname + "\\"; if (rowcount / pagesize == 0) { for (int i = 1; i <= 1; i++) { var list = mGetDataByPage.Invoke(obj, new object[] { i, 1000 }); using (StreamWriter sw = File.CreateText(path + "" + i + ".txt")) { Assembly assmodel = Assembly.LoadFile("C:\\Users\\otsoftadmin\\Documents\\Visual Studio 2010\\Projects\\IndexFactory\\Model\\bin\\Debug\\IndexFactory.Model.dll"); Type tm = assmodel.GetType("IndexFactory.Model." + dbname + ""); foreach ( object model in list)
得到的是List<Model.Asppatent>
凹加凸等于啥 2014-08-26
  • 打赏
  • 举报
回复
引用 1 楼 a475372067 的回复:
首先你要先知道IndexFactory这个DLL中执行mGetDataByPage.Invoke(obj, new object[] { i, 1000 });得到的是什么?
如果是list集合你可以参照下面代码
 public static List<object> GetRefection(object obj) 
       {
           List<object> objs = new List<object>();
           Type t = obj.GetType();
          
               PropertyInfo[] pros = t.GetProperties();
               for (int i = 0; i < 2; i++)
               {
                 
                   foreach (PropertyInfo pro in pros)
                   {
                       pro.SetValue(obj, i.ToString(), null);
                   }
                   objs.Add(obj);
               }
           
           return objs;
       }
凹加凸等于啥 2014-08-26
  • 打赏
  • 举报
回复
首先你要先知道IndexFactory这个DLL中执行mGetDataByPage.Invoke(obj, new object[] { i, 1000 });得到的是什么?
hxymiller 2014-08-26
  • 打赏
  • 举报
回复
引用 9 楼 jun471537173 的回复:
IList MakeListOfType(Type listType) { Type type = typeof(List<>); Type specificListType = type.MakeGenericType(listType); return (IList)Activator.CreateInstance(specificListType); } IList list = MakeListOfType(tm);
多谢,就是这个~~已解决了。
threenewbee 2014-08-26
  • 打赏
  • 举报
回复
最简单的是用dynamic,连反射都省了 假设obj是你反射得到的list: object list = ... foreach (dynamic item in list as IEnumerable) { string s = item.Name; // 假设 item 有个属性叫 Name }
jun471537173 2014-08-26
  • 打赏
  • 举报
回复
IList MakeListOfType(Type listType) { Type type = typeof(List<>); Type specificListType = type.MakeGenericType(listType); return (IList)Activator.CreateInstance(specificListType); } IList list = MakeListOfType(tm);
Justin-Liu 2014-08-26
  • 打赏
  • 举报
回复
遍历的时候转换 形如
foreach (IMachine m in machineList) {
    if (m is MachineLine) {
        ProcessLine((MachineLine) m);
    } else if (m is MachineCircle) {
        ProcessLine((MachineCircle) m);
    }
}
凹加凸等于啥 2014-08-26
  • 打赏
  • 举报
回复
引用 6 楼 hxymiller 的回复:
[quote=引用 5 楼 bdmh 的回复:] 如果你的得到的是List<Model.Asppatent> 那就是 foreach(Model.Asppatent item in list)
反射调用方法只有执行完后才知道数据类型,我现在是没执行之前用var去接获取的数据,然后再遍历他[/quote] var list = mGetDataByPage.Invoke(obj, new object[] { i, 1000 }); 你这不是执行了么? 你不执行你这list怎么来啊? 还是你没说清楚
hxymiller 2014-08-26
  • 打赏
  • 举报
回复
引用 5 楼 bdmh 的回复:
如果你的得到的是List<Model.Asppatent> 那就是 foreach(Model.Asppatent item in list)
反射调用方法只有执行完后才知道数据类型,我现在是没执行之前用var去接获取的数据,然后再遍历他
bdmh 2014-08-26
  • 打赏
  • 举报
回复
如果你的得到的是List<Model.Asppatent> 那就是 foreach(Model.Asppatent item in list)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧