反射列表并转换泛型

feixuyue 2013-04-13 01:33:31
通过反射,得到一个列表 datalist(:object)
但列表的泛型不确定,需要反射才能得到其类型DataType(:IData)
通过反射得到该泛型为dd;
列表泛型都是实现了借口IData,
如何将反射得到的datalist列表转换为List<IData>?
datalist=dl.getvalue(this);
datalist as list<dd>
datalist as typeof(list<>).makegenerictype(dd)
请问一下如何解决?
...全文
114 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2013-04-13
  • 打赏
  • 举报
回复
看看简单的例子可以运行不
 object x = new List<int> { 1, 2, 3 };

            if (x is IEnumerable<int>)
            {
                List<int> y = ((IEnumerable<int>)x).ToList();
        
            }
wanghui0380 2013-04-13
  • 打赏
  • 举报
回复
甚至在里那句话的基础上都可以直接转换 if(datalist is IEnumerable<IDate>) { List<IData> res=(IEnumerable<IDate>datalist).ToList(); } else { throw new ArgumentException("数据不符合预期,数据必须实现IEnumerable<IDate>") }
wanghui0380 2013-04-13
  • 打赏
  • 举报
回复
列表泛型都是实现了借口IData,
记住你自己说的这句话,他是列表集合,所以他必定继承与IEnumerable,都是你自己也都说了,他们都已经实现了IData, 两个条件你都清楚,为啥还非要反射呢?
  • 打赏
  • 举报
回复
引用 4 楼 feixuyue 的回复:
datalist是object,怎么遍历?
你这那叫做“通过反射得到一个列表”啊。 在设计的当初,就应该把所有需要序列化的列表都设计为简单的数组。 尽可能不要使用反射。真正会使用反射的人不会滥用反射的。除非万不得已。 如果你一定要反射,可以参考:http://www.cnblogs.com/Ninputer/archive/2006/06/02/415458.html 不过我还是强调,尽量不要反射。
wanghui0380 2013-04-13
  • 打赏
  • 举报
回复
哎,既然都已经知道类型,还非吊在反射这颗树上做啥子 object x = new List<int> { 1, 2, 3 }; //x 已经是object了吧 if (x is IEnumerable)//凡是即可都实现这个接口 { var y = (IEnumerable)x;//既然是集合类,那么就可以转换他 List<int> res= y.Cast<int>().ToList();//既然转换成了IEnumerable就可以用linq方法中的Cast,Oftype,这个res就是你想要的东西 }
feixuyue 2013-04-13
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
((IEnumerable<dd>)a.AsEnumerable()).ToList() 额,我发现我自己写的很多余啊,这个可以省掉as那块 ((IEnumerable<dd>)a).ToList()
dd只是我反射得到的type类型, IEnumerable<dd> list<dd> 都会报错.
feixuyue 2013-04-13
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
引用 楼主 feixuyue 的回复: 通过反射,得到一个列表 datalist(:object) 但列表的泛型不确定,需要反射才能得到其类型DataType(:IData) 通过反射得到该泛型为dd; 列表泛型都是实现了借口IData, 如何将反射得到的datalist列表转换为List<IData>? datalist=dl.getvalue(this); datalist as……
datalist是object,怎么遍历?
wanghui0380 2013-04-13
  • 打赏
  • 举报
回复
((IEnumerable<dd>)a.AsEnumerable()).ToList() 额,我发现我自己写的很多余啊,这个可以省掉as那块 ((IEnumerable<dd>)a).ToList()
  • 打赏
  • 举报
回复
引用 楼主 feixuyue 的回复:
通过反射,得到一个列表 datalist(:object) 但列表的泛型不确定,需要反射才能得到其类型DataType(:IData) 通过反射得到该泛型为dd; 列表泛型都是实现了借口IData, 如何将反射得到的datalist列表转换为List<IData>? datalist=dl.getvalue(this); datalist as list<dd……
既然你知道类型都是 List<IData>,那么写
var lst = new List<IData>();
foreah(var x in datalist)
   lst.Add((IData)x);
这就行了。
wanghui0380 2013-04-13
  • 打赏
  • 举报
回复
???? 不知道你的问题在哪里?? 你都字段是 list<dd>,那就直接 datalist.Cast<dd>().tolist() 或者 datalist.oftype<dd>().tolist() 或者 ((IEnumerable<dd>)a.AsEnumerable()).ToList()

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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