使用反射和结构贴图

本文关键字:结构 反射 | 更新日期: 2023-09-27 18:20:18

我正在使用结构映射将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多个项目,这不是一个可行的解决方案。我需要使用反射和来实现这一点,理想情况下让结构图来确定类型并为我注入它们。

使用反射和结构贴图

根据我从提供的信息中了解到的情况,在将dataContext对象的类型传递给IRepository和Repository泛型类之前,您需要将其强制转换为其真实类型。这意味着你想让它们成为混凝土。可以在运行时使它们具体化,但不能通过将Type对象作为泛型参数进行传递来。此外,这里不能依赖泛型类型推断,因为这只能在编译时完成。

我假设您的方法返回一个IRepository或Respository(没有泛型参数)。

以下是您需要做的:为Repository<>创建一个具体类型使用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;