当前位置:编程学习 > C#/ASP.NET >>

反射列表并转换泛型

通过反射,得到一个列表 datalist(:object)
但列表的泛型不确定,需要反射才能得到其类型DataType(:IData)
通过反射得到该泛型为dd;
列表泛型都是实现了借口IData,
如何将反射得到的datalist列表转换为List<IData>?
datalist=dl.getvalue(this);
datalist as list<dd>
datalist as typeof(list<>).makegenerictype(dd)请问一下如何解决? 泛型 对象 反射 --------------------编程问答-------------------- ????
不知道你的问题在哪里??

你都字段是 list<dd>,那就直接 
datalist.Cast<dd>().tolist()
或者
datalist.oftype<dd>().tolist()
或者
 ((IEnumerable<dd>)a.AsEnumerable()).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);

这就行了。
--------------------编程问答--------------------  ((IEnumerable<dd>)a.AsEnumerable()).ToList() 

额,我发现我自己写的很多余啊,这个可以省掉as那块

((IEnumerable<dd>)a).ToList() 
--------------------编程问答--------------------
引用 2 楼 sp1234 的回复:
引用 楼主 feixuyue 的回复:
通过反射,得到一个列表 datalist(:object)
但列表的泛型不确定,需要反射才能得到其类型DataType(:IData)
通过反射得到该泛型为dd;
列表泛型都是实现了借口IData,
如何将反射得到的datalist列表转换为List<IData>?
datalist=dl.getvalue(this);
datalist as……

datalist是object,怎么遍历? --------------------编程问答--------------------
引用 3 楼 wanghui0380 的回复:
((IEnumerable<dd>)a.AsEnumerable()).ToList() 

额,我发现我自己写的很多余啊,这个可以省掉as那块

((IEnumerable<dd>)a).ToList()

dd只是我反射得到的type类型,
IEnumerable<dd>
list<dd>
都会报错. --------------------编程问答-------------------- 哎,既然都已经知道类型,还非吊在反射这颗树上做啥子

  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就是你想要的东西
            } --------------------编程问答--------------------
引用 4 楼 feixuyue 的回复:
datalist是object,怎么遍历?


你这那叫做“通过反射得到一个列表”啊。

在设计的当初,就应该把所有需要序列化的列表都设计为简单的数组。
尽可能不要使用反射。真正会使用反射的人不会滥用反射的。除非万不得已。
如果你一定要反射,可以参考:http://www.cnblogs.com/Ninputer/archive/2006/06/02/415458.html


不过我还是强调,尽量不要反射。 --------------------编程问答--------------------
列表泛型都是实现了借口IData,

记住你自己说的这句话,他是列表集合,所以他必定继承与IEnumerable,都是你自己也都说了,他们都已经实现了IData, 两个条件你都清楚,为啥还非要反射呢? --------------------编程问答-------------------- 甚至在里那句话的基础上都可以直接转换

if(datalist is IEnumerable<IDate>)
{
List<IData> res=(IEnumerable<IDate>datalist).ToList();
}
else
{
   throw new ArgumentException("数据不符合预期,数据必须实现IEnumerable<IDate>")
} --------------------编程问答-------------------- 看看简单的例子可以运行不

 object x = new List<int> { 1, 2, 3 };

            if (x is IEnumerable<int>)
            {
                List<int> y = ((IEnumerable<int>)x).ToList();
        
            }
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,