我正在使用结构图自动将DataContext注入我的Repository构造函数。我给了一个名字(例如“Project1”),我需要为项目动态创建一个Repository实例。
我正在使用标准命名约定,所以我知道它是“Project1DataContext”。我已经设法使用反射创建了Project1DataContext的实例,但它是一个对象类型。问题是我需要将Project1DataContext对象传递到我的存储库以创建它的实例。我怎么能用反射做到这一点?是否可以通过某种方式投射物体?
Assembly myDataContextAssembly = typeof(SomeTypeInTheAssembly).Assembly;
Type dataContextType = myDataContextAssembly.GetType(ProjectName + "DataContext");
object dataContext = Activator.CreateInstance(dataContextType);
// I need to cast the data context here
IRepository<Project1DataContext> = new Repository<Project1DataContext>(dataContext)
与此同时,我将使用if语句,但如果我有100多个项目,这不是一个可行的解决方案。我需要使用反射执行此操作,理想情况下具有结构图确定类型并为我注入它们。
答案 0 :(得分:1)
根据我提供的信息,我们希望在将该类型传递给IRepository和Repository泛型类之前,将dataContext对象转换为其真实类型。这意味着你想让它们具体。 可以在运行时使其具体化,但不通过将Type对象作为泛型参数传递。此外,您不能在此处依赖泛型类型推断,因为这仅在编译时完成。
我假设你的方法返回一个IRepository或Respository(没有通用参数)。
以下是您需要做的事情:为Repository&lt;&gt;创建具体类型使用dataContextType,然后使用该具体类型创建一个Repository对象,然后将其转换为Repository,然后将其返回。
Assembly myDataContextAssembly = typeof(SomeTypeInTheAssembly).Assembly;
Type dataContextType = myDataContextAssembly.GetType(ProjectName + "DataContext");
Type concreteRepositoryType = typeof(Generic<>).MakeGenericType(dataContextType);
Repository repository = (Repository)System.Activator.CreateInstance(concreteRepositoryType);
return repository;