C#-将对象强制转换为IList<;T>;基于类型

C#-将对象强制转换为IList<;T>;基于类型,c#,generics,reflection,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 o

我正在尝试进行一些反思,并对如何将结果对象强制转换为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
}
private void加载条(类型barType)
{
//foo有一个返回条的方法
类型foo=类型of(foo);
MethodInfo method=foo.GetMethod(“GetBars”)
.MakeGenericMethod(bar);
object obj=method.Invoke(foo,新对象[]{/*这里的参数*/});
//我们如何将obj转换为IList-barType
}

我们如何从barType参数强制转换method.Invoke的结果到IList类型?

强制转换的要点通常是告诉编译器您有一些额外的信息—您在编译时知道一些东西。你不知道这里的信息-你只知道它在执行时


铸造后,您希望如何处理该值?诚然,有时它会很有用——当您必须使用泛型接口时,即使您想要获取不需要类型参数的成员(例如
IList中的
Count
)。但是,如果您不想这样做,那么如果您能提供更多信息,这将非常有帮助。

在.NET 4.0中,您可以使用表达式树来实现这一点。

专用void loadbar()
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 */ });
}
{ 类型barType=类型(T); //foo有一个返回条的方法 类型foo=类型of(foo); MethodInfo method=foo.GetMethod(“GetBars”) .MakeGenericMethod(bar); IList obj=(IList)method.Invoke(foo,new object[]{/*arguments here*/}); }
只有在函数调用方在编译时而不是运行时创建新的barType时,强制转换才有意义。一旦这是真的,您可以将函数模板化为:

private IList<T> LoadBars<T>()
{
...
return obj as IList<T>;
}
private IList加载条()
{
...
返回obj作为IList;
}

我刚刚解决完这个问题。
确实,您不能将对象强制转换为通用IList,但可以通过调用List对象的“ToArray”方法将其转换为强类型数组

从另一个博客盗取的解决方案。

ToArrayMethod=obj.GetType().GetMethod(“ToArray”)


System.Array stronglyTypedArray=(System.Array)到ArrayMethod.Invoke(obj,null)

确切地说,但是现在必须在编译时知道T。我们希望迭代列表作为它的强制类型。我承认这没有任何意义,我们需要告诉编译器类型,以便它生成所需的内容。这个问题的目的是探索一个edge案例,它实际上是一个围绕LOB不规则性的破解。谢谢你为我清楚地介绍了这个问题。