Есть ли простой способ скопировать тип с использованием отражения? - PullRequest
2 голосов
/ 24 сентября 2010

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

Если у меня есть какой-то тип T, могу ли я использовать отражение для определения нового типа , назовем его T2, который в основном будет идентичен T? То, что я ищу, - это, по сути, динамический способ сделать эквивалент того, что получилось бы, если бы я написал один и тот же код (кроме имени класса) в двух отдельных файлах исходного кода и скомпилировал оба.

Ответы [ 3 ]

3 голосов
/ 24 сентября 2010

Я не думаю, что есть метод волшебной пули, который сделает вашу работу за вас, но вы можете сделать это с помощью Reflection Emit.

Вот хороший учебник по частям предмета. Начните там, затем перейдите к некоторым из родственных статей .

1 голос
/ 25 сентября 2010

Ссылки Рэндольфо должны указывать вам правильное направление.Что касается передачи идентичной функциональности, вы можете извлечь IL из методов, вызвав X.GetMethodBody().GetILAsByteArray(), где X - данный экземпляр MethodInfo.Это все равно нужно будет перевести и переиздать в вашем новом методе, потому что, насколько я знаю, не существует прямого способа записать поток байтов IL [] в конкретный генератор ILG как IL.

Haibo Luo опубликовал сообщение в блоге об этом с 2005 года, которое может указать вам верное направление для перевода (я не пробовал его, поэтому не могу убедиться, что он работает).

0 голосов
/ 04 октября 2010

Вы можете скопировать структуру типа, используя типы System.Reflection.Emit + тела методов traverse и clone, с помощью таких инструментов, как MethodBodyReader или CCI или Cecil . Но что, если метод в исходном типе использовал какое-то внутреннее поле или вызывал внутренний метод, или, возможно, использовал свойство внешнего класса (в случае внутреннего класса) ... В результате вы получите неверный код. Чтобы исправить это, ваш вновь созданный тип должен быть расположен рядом с исходным типом. К счастью, Сесил и ТПП могут сделать этот трюк.

...