2010-09-05 1 views
1

Существует много потоков о том, как создать метод с использованием Reflection.Emit, но я не могу найти его при клонировании или копировании существующего метода.. NET: клонировать существующий метод динамически с Reflection.Emit

Я хотел бы скопировать существующий класс и добавить к нему еще несколько дополнительных полей. У меня проблемы с копированием методов. Я прочитал, что вы не можете просто взять IL-код из тела, потому что токены относятся к существующему модулю. Можно ли клонировать или копировать метод класса другого класса с помощью метода MethodBuilder?

+0

Возможно, [это] (http://blogs.msdn.com/b/haibo_luo/archive/2006/11/07/turn-methodinfo-to-dynamicmethod.aspx) может помочь –

ответ

3

Ну, это возможно, но довольно неудобно. Проблема в том, что класс MethodBody позволяет вам получить IL только как массив байтов. Однако метод ILGenerator.Emit() не имеет перегрузки, чтобы просто скопировать эти байты в динамический метод. Это требует, чтобы вы использовали надлежащую перегрузку для генерации соответствующей инструкции IL.

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

+1

Я думаю, что это возможно -cut: http://msdn.microsoft.com/en-us/library/system.reflection.emit.methodrental.swapmethodbody.aspx –

0

Посмотрите на PostSharp и его основные технологии.

 Смежные вопросы

  • Нет связанных вопросов^_^