C# 创建一个列表<;T>;使用类型对象代替T

C# 创建一个列表<;T>;使用类型对象代替T,c#,generics,C#,Generics,我有一个叫做懒虫装载机的东西。它连接到ORM,以便在需要时加载T类型的数据。它起作用了 LazyLoader继承自ILazyLoader 挑战:创建一个工厂类,可以从对象类型加载泛型类型 如: public ILazyLoader CreateLazyLoader(int id, Type typeToLoad) { return new LazyListLoader<typeToLoad>(id); } public-ILazyLoader-CreateLazyLoade

我有一个叫做懒虫装载机的东西。它连接到ORM,以便在需要时加载T类型的数据。它起作用了

LazyLoader继承自ILazyLoader

挑战:创建一个工厂类,可以从对象类型加载泛型类型

如:

public ILazyLoader CreateLazyLoader(int id, Type typeToLoad)
{
    return new LazyListLoader<typeToLoad>(id);
}
public-ILazyLoader-CreateLazyLoader(int-id,键入typeToLoad)
{
返回新的LazyListLoader(id);
}
问题:不接受类型对象。如何将类型转换为类似于T是typeToLoad的类型?

var llType=typeof(LazyListLoader);
var llType = typeof(LazyListLoader<>).MakeGenericType(typeToLoad);
return (ILazyLoader)Activator.CreateInstance(llType, id);
return(ILazyLoader)Activator.CreateInstance(llType,id);
尝试以下操作

var unboundType = typeof(LazyListLoader<>);
var boundType = unboundType.MakeGenericType(typeToLoad);
return (ILazyLoader)Activator.CreateInstance(boundType, new[] {id});
var unboundType=typeof(LazyListLoader);
var boundType=unboundType.MakeGenericType(typeToLoad);
return(ILazyLoader)Activator.CreateInstance(boundType,new[]{id});

它应该是泛型类型参数,而不是参数
public-ILazyLoader-CreateLazyLoader(int-id){return new LazyListLoader(id);}
如果在编译时不知道类型,那么这是一个非常大的标志,您不应该首先使用ORM。它们提供的绝大多数功能要么要求您在编译时了解正在处理的类型,要么如果您不知道这些信息,就无法为您提供不使用ORM的任何好处。@asawyer:我认为您不能在没有任何上下文的情况下如此明确地说这一点。虽然泛型当然更适合于编译时已知的类型,但它远不是一个不常见的要求,在某些情况下它是合理的。@Servy我不知道类型的原因,是因为它可以被继承。延迟加载程序的目标是等待加载对象,直到调用它为止。在本例中,我们有一个直接与数据库交互的DLL,并且ORM系统工作得很好。但是为了保护数据库,外部系统通过web服务连接到数据库。外部dll使用不同的LazyLoader,它依赖于WebService而不是ORM来加载数据。为了实现这一点,factory方法实际上调用了一个静态事件,该静态事件默认为隐藏的ORM方法,但需要overridden@WarpWars.Net然后听起来您实际上不需要这个功能,并且可以使用简单地应用约束的通用方法来为您提供足够的资源来处理这些项。听起来您不需要基于
类型构建对象。