如何动态调用Cast <t> </t>

时间:2013-10-28 23:13:45

标签: c# generics reflection casting

我想要一个List<object>强制转换为强类型数组。问题是我在编译时不知道列表类型,因为它可能是许多对象中的一个。

基本上如果我Type objectType = list[0].GetType(),我希望能够拨打list.Cast<objectType>().ToArray()

我该怎么做?我尝试使用Reflection如下:

Type listType = list[0].GetType();
MethodInfo castMethod = typeof(Enumerable).GetMethod("Cast", BindingFlags.Static | BindingFlags.Public);
castMethod = castMethod.MakeGenericMethod(new Type[] { listType });
castMethod.Invoke(null, new object[] { list});

调用返回一个似乎没有公共方法的CastIterator。

1 个答案:

答案 0 :(得分:4)

您可以使用:

MethodInfo castMethod = typeof(Enumerable).GetMethod("Cast", BindingFlags.Static | BindingFlags.Public);
castMethod = castMethod.MakeGenericMethod(new Type[] { listType });
object castIterator = castMethod.Invoke(null, new object[] { list});
var toArrayMethod = typeof(Enumerable).GetMethod("ToArray", BindingFlags.Static | BindingFlags.Public);
toArrayMethod = toArrayMethod.MakeGenericMethod(new Type[] { listType });
object theArray = toArrayMethod.Invoke(null, new[] {castIterator});

在此结束时,theArray将是一个强类型的数组。