在运行时将Type传递给泛型方法

时间:2013-05-22 18:42:19

标签: c# generics reflection

我有类似的东西

Type MyType = Type.GetType(FromSomewhereElse);

var listS = context.GetList<MyType>().ToList();

我希望在这种情况下获取MyType,并将其传递给Generic Type方法GetList

这是我得到的错误:

  

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

3 个答案:

答案 0 :(得分:19)

您可以使用反射并构建您的调用:

Type MyType = Type.GetType(FromSomewhereElse);

var typeOfContext = context.GetType();

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

var genericMethod = method.MakeGenericMethod(MyType);

genericMethod.Invoke(context, null);

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

答案 1 :(得分:3)

你必须使用反射:

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

IEnumerable result = (IEnumerable)method.Invoke(context, new object[0]);
List<object> listS = result.Cast<object>().ToList();

但是,无法将类型实例MyType用作静态类型变量,因此您可以做的最好的事情是将结果键入object

答案 2 :(得分:-1)

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

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

动态创建泛型类型。

Type listFactoryType = typeof(GenericListFactory<>).MakeGenericType(elementType);
var dynamicGeneric = (IListFactory)Activator.CreateInstance(listFactoryType);

您可以创建一个公开该方法的泛型类,而不是使用泛型方法获取List。你可以从这样的界面派生出来。

interface IListFactory
{
   IList GetList();
}

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