Подтвердить что ты не робот

Можно ли изменить тело метода во время выполнения в .NET?

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

Любые предложения?

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

4b9b3361

Ответ 1

PostSharp, который является aftercompiler, делает что-то похожее на то, что вы описываете, используя атрибуты для маркировки точек впрыска в коде, только разница что он делает это во время компиляции.

Но вы также можете делать это во время выполнения, не меняя тела методов, а используя классы, полученные из ContextBoundObject, который является классом .Net который позволяет перехватить все вызовы, сделанные против него. Ниже приведена статья .NET unmanaged API профилирования для перехвата метода JIT-ing и замены методов тела перед JIT-ing. Этот метод успешно используется JustMock (Telerik) для издевательства, статических методов, не виртуальных методов и даже закрытых классов.

Ответ 2

Вы не можете изменить существующий метод во время выполнения, но вы можете создать его с помощью кода DOM на лету и выполнить его. Или вы могли бы объединить строки кода и скомпилировать его в памяти и запустить это.

Я сам сделал последнее (приложение, которое я разрешил собственный код С#, который был скомпилирован и выполнен в памяти, время выполнения).

Ответ 3

Если вы хотите добавить аспекты до или после вызова, посмотрите PostSharp: http://www.postsharp.org/

Ответ 5

Планируете ли вы сделать это для произвольных типов? Я бы предположил, что не получил, что вы собираетесь украсить методы атрибутом.

Учитывая это, я бы подумал, что лучшим подходом было бы определение абстрактных методов в суперклассе для ваших типов. Метод суперкласса может содержать код метода котельной пластины и делегировать конкретные реализации посредством абстрактных методов для индивидуального поведения этого метода.

В общем говоря, если вы не входите в создание файлов кода и не компилируете динамические сборки во время выполнения, то то, что вы ищете, не может быть выполнено. Вероятнее всего, существуют гораздо более практические принципы и модели ОО, которые можно использовать для достижения близкого к одному и тому же результату.