C# 在运行时将类型传递给泛型方法

C# 在运行时将类型传递给泛型方法,c#,generics,reflection,C#,Generics,Reflection,我有类似的东西 Type MyType = Type.GetType(FromSomewhereElse); var listS = context.GetList<MyType>().ToList(); Type MyType=Type.GetType(从其他地方); var list=context.GetList().ToList(); 在本例中,我希望获取类型MyType,并将其传递给泛型类型方法GetList 这就是我得到的错误: 找不到类型或命名空间名称“MyTyp

我有类似的东西

Type MyType = Type.GetType(FromSomewhereElse);

var listS = context.GetList<MyType>().ToList();
Type MyType=Type.GetType(从其他地方);
var list=context.GetList().ToList();
在本例中,我希望获取类型MyType,并将其传递给泛型类型方法GetList

这就是我得到的错误:

找不到类型或命名空间名称“MyType”(是否缺少using指令或程序集引用?)


您不会使用类型动态构建泛型。泛型是用类的名称而不是类型来填充的

您可以使用Activator.CreateInstance创建泛型类型。您必须动态构建泛型类型

Type listFactoryType = typeof(GenericListFactory<>).MakeGenericType(elementType);
var dynamicGeneric = (IListFactory)Activator.CreateInstance(listFactoryType);
动态创建泛型类型

Type listFactoryType = typeof(GenericListFactory<>).MakeGenericType(elementType);
var dynamicGeneric = (IListFactory)Activator.CreateInstance(listFactoryType);
Type listFactoryType=typeof(GenericListFactory)。MakeGenericType(elementType);
var dynamicGeneric=(IListFactory)Activator.CreateInstance(listFactoryType);
您可以创建一个公开该方法的泛型类,而不是使用泛型方法获取列表。您可以从这样的接口派生

interface IListFactory
{
   IList GetList();
}

class GenericListFactory<T>
{
   public IList GetList() { return new List<T>(); }
}
接口IListFactory
{
IList GetList();
}
类GenericListFactory
{
public IList GetList(){return new List();}
}

您可以使用反射并像这样构造调用:

Type MyType = Type.GetType(FromSomewhereElse);

var typeOfContext = context.GetType();

var method = typeOfContext.GetMethod("GetList");

var genericMethod = method.MakeGenericMethod(MyType);

genericMethod.Invoke(context, null);

请注意,使用反射调用方法将增加巨大的性能损失,如果可能,请尝试重新设计解决方案。

您必须使用反射:

var method = context.GetType()
    .GetMethod("GetList").MakeGenericMethod(MyType)

IEnumerable result = (IEnumerable)method.Invoke(context, new object[0]);
List<object> listS = result.Cast<object>().ToList();
var method=context.GetType()
.GetMethod(“GetList”).MakeGenericMethod(MyType)
IEnumerable结果=(IEnumerable)方法。调用(上下文,新对象[0]);
List listS=result.Cast().ToList();

但是,无法将类型实例
MyType
用作静态类型变量,因此最好将结果键入为
object

您需要使用反射。
new[]{MyType}
可以是
MyType
,因为
MakeGenericMethod
接受
params
。谢谢,我已经修改了解决方案,将其包括在内。您可以通过使用动态方法来规避性能损失。当然,您仍然会受到一次性惩罚,但这是重反射使用的关键(如果您可以访问该功能)。