使用反射和结构图

时间:2012-01-13 18:00:54

标签: c# reflection structuremap

我正在使用结构图自动将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多个项目,这不是一个可行的解决方案。我需要使用反射执行此操作,理想情况下具有结构图确定类型并为我注入它们。

1 个答案:

答案 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;