Создание класса, реализующего интерфейс динамически - PullRequest
5 голосов
/ 23 августа 2010

Я пытаюсь написать код, который позволяет пользователю загрузить сборку (файл DLL), выбрать интерфейс в указанной сборке, а затем создать класс, наследующий этот интерфейс, с заглушками для всех необходимых методов.

Класс будет сгенерирован либо в файле, либо в активном сеансе VS (код предназначен для использования внутри IWizard, инициализированного при создании проекта с помощью пользовательского шаблона).

Я дошел до того, что у меня есть объект Type интерфейса, но мне трудно разобраться в следующей части, я подумал о том, чтобы перебирать методы интерфейса в цикле и копировать их в текстовый файл. , добавив реализации заглушки в соответствующие места, но я уверен, что есть какой-то лучший способ, возможно, с помощью стороннего инструмента?

Любая помощь будет оценена, Заранее спасибо.

1 Ответ

4 голосов
/ 23 августа 2010

Если вы хотите создать новый тип во время выполнения, вам нужно использовать Reflection.Emit. Reflection.Emit позволяет передавать промежуточный язык непосредственно в текущий домен приложений (или сборку, если вы предпочитаете.) Возможно, вы хотите использовать тип в памяти, поэтому вы можете не захотеть создавать фактическую сборку.

Создание нового типа выполняется с помощью класса TypeBuilder.

Codeproject имеет отличное введение: http://www.codeproject.com/KB/dotnet/Creating_Dynamic_Types.aspx

ОБНОВЛЕНИЕ:

Мне стало известно, что цель состоит в том, чтобы добавить файл кода C # в существующий проект. Вам все еще нужно будет отразить сборку и создать IL, но тогда вам придется «разбирать» IL на C #. Reflector - это # ​​1 рекомендуемый инструмент для этого , хотя я не уверен, что его можно автоматизировать так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...