我有这样的东西
Type MyType = Type.GetType(FromSomewhereElse);
var listS = context.GetList<MyType>().ToList();
我想获取在这种情况下为 MyType 的 Type 并将其传递给 Generic Type 方法 GetList
这是我得到的错误:
找不到类型或命名空间名称“MyType”(您是否缺少 using 指令或程序集引用?)
我有这样的东西
Type MyType = Type.GetType(FromSomewhereElse);
var listS = context.GetList<MyType>().ToList();
我想获取在这种情况下为 MyType 的 Type 并将其传递给 Generic Type 方法 GetList
这是我得到的错误:
找不到类型或命名空间名称“MyType”(您是否缺少 using 指令或程序集引用?)
您可以使用反射并像这样构造您的调用:
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();
但是,没有办法将您的类型实例MyType
用作静态类型变量,因此您能做的最好的事情就是将结果键入为object
.
您不会使用类型动态构建泛型。泛型用类的名称填充,而不是类型。
您可以使用 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>(); }
}