反射列表并转换泛型
通过反射,得到一个列表 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() --------------------编程问答--------------------
既然你知道类型都是 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()
--------------------编程问答--------------------
datalist是object,怎么遍历? --------------------编程问答--------------------
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就是你想要的东西
} --------------------编程问答--------------------
你这那叫做“通过反射得到一个列表”啊。
在设计的当初,就应该把所有需要序列化的列表都设计为简单的数组。
尽可能不要使用反射。真正会使用反射的人不会滥用反射的。除非万不得已。
如果你一定要反射,可以参考: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#