我正在尝试一些反思,并对如何将结果对象转换为IList提出疑问。
以下是反思:
private void LoadBars(Type barType)
{
// foo has a method that returns bars
Type foo = typeof(Foo);
MethodInfo method = foo.GetMethod("GetBars")
.MakeGenericMethod(bar);
object obj = method.Invoke(foo, new object[] { /* arguments here */ });
// how can we cast obj to an IList<Type> - barType
}
我们如何转换方法的结果。从barType参数中调用到类型的IList?
答案 0 :(得分:5)
演员表的目的通常是告诉编译器你有一些额外的信息 - 你在编译时知道某些事情。您在此处不知道这些信息 - 您只能在执行时间知道它。
投射后,您对该值的期望是什么?无可否认,当有必要使用通用接口时,有一些时间,即使你想要获得不需要类型参数的成员(例如{{1在Count
)中。但是,如果这不是你想要做的,那么如果你能提供更多信息,那将会非常有帮助。
答案 1 :(得分:4)
我刚刚完成了这个问题的摔跤 没错,您不能将对象强制转换为Generic IList,但可以通过调用List对象的“ToArray”方法将其转换为强类型数组。
解决方案来自另一个博客。 http://amazedsaint.blogspot.com/2008/04/creating-generic-list-at-runtime.html
ToArrayMethod = obj.GetType()。GetMethod(“ToArray”);
System.Array strongTypedArray =(System.Array)ToArrayMethod.Invoke(obj,null);
答案 2 :(得分:0)
在.NET 4.0中,您可以使用表达式树来实现这一目标。
答案 3 :(得分:0)
private void LoadBars<T>()
{
Type barType = typeof(T);
// foo has a method that returns bars
Type foo = typeof(Foo);
MethodInfo method = foo.GetMethod("GetBars")
.MakeGenericMethod(bar);
IList<T> obj = (IList<T>)method.Invoke(foo, new object[] { /* arguments here */ });
}
答案 4 :(得分:0)
只有在编译时函数的调用者新 barType 而不是运行时时,才能进行强制转换。一旦这是真的,你可以将函数模板化为:
private IList<T> LoadBars<T>()
{
...
return obj as IList<T>;
}