C# - 根据Type </t>将对象强制转换为IList <t>

时间:2010-03-22 14:57:52

标签: c# generics reflection

我正在尝试一些反思,并对如何将结果对象转换为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?

5 个答案:

答案 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>;
}