目前我有一个IList<object>
类型的对象,我需要使用Type对象转换为另一种类型的IList
。
例如
Type t = typeof(MyType);
var list = OtherClass.MyFunction(myParam param);
var list 的类型为IList<object>
,我需要它为IList<t>
目前我有一个静态函数并调用反射,但这是在一个循环中调用的,需要最小化在循环中花费的最长时间。
任何人都知道在不使用反射的情况下执行此转换的任何其他方法吗?
委托代表可能吗?
答案 0 :(得分:5)
您可以使用Enumerable.Cast<T>()
:
var myList = list.Cast<MyType>().ToList();
答案 1 :(得分:0)
如果在编译时不知道T,我想你可以:
var type = typeof(int);
IList<object> myList = (new object[]{1, 2, 3, 4, 5}).ToList();
var mi = typeof(Enumerable).GetMethod("Cast");
var mRef = mi.MakeGenericMethod(type);
object myIEnumerableOfInt = mRef.Invoke(null, new object[]{myList});
mi = typeof(Enumerable).GetMethod("ToList");
mRef = mi.MakeGenericMethod(type);
IList myIListOfInt = (IList)mRef.Invoke(null, new object[]{myIEnumerableOfInt});
...但是在这里使用此反映意味着您永远无法将其称为IList<int>
,因此您在代码中可以推断的最多是myIListOfInt
是IList
这里的铸造是完全没用的。