Использование карты отражения и структуры - PullRequest
2 голосов
/ 13 января 2012

Я использую карту структуры, чтобы автоматически вставлять DataContext в конструктор репозитория. Мне дано имя (например, «Project1»), и мне нужно динамически создать экземпляр репозитория для проекта.

Я использую стандартное соглашение об именах, поэтому я знаю, что это "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 Ответ

1 голос
/ 18 января 2012

Учитывая то, что я понимаю из предоставленной информации, вы хотите привести объект dataContext к его реальному типу, прежде чем передавать этот тип в универсальные классы IRepository и Repository. Это означает, что вы хотите сделать их бетон . Вы можете сделать их конкретными во время выполнения, но не путем передачи объекта Type в качестве универсального аргумента. Кроме того, здесь нельзя полагаться на вывод обобщенного типа, поскольку это делается только во время компиляции.

Я предполагаю, что ваш метод возвращает IRepository или Respository (без общих параметров).

Вот что вам нужно сделать: создать конкретный тип для репозитория <>, используя dataContextType, а затем использовать этот конкретный тип для создания объекта репозитория, который вы приведете к репозиторию, а затем вернуть его.

        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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...