Можно ли изменить тело метода во время выполнения в .NET?
Я знаю, что возможно (теоретически) создать новый тип во время выполнения, но возможно ли изменить тело метода существующего типа во время выполнения? Мой план (если я могу заставить это работать) - это пометить методы с помощью настраиваемого атрибута, а затем во время поиска методов с атрибутом и вставить часть моего собственного кода в тело метода.
Любые предложения?
Я полагаю, что если я не смогу использовать этот подход для работы, я всегда мог бы использовать виртуальный метод в базовом классе (с атрибутами) в сочетании со статическим factory, чтобы выплескивать производный динамический тип с помощью моего метод генерирования времени выполнения в дочернем классе. Однако это было бы не так просто использовать.
Ответы
Ответ 1
PostSharp, который является aftercompiler, делает что-то похожее на то, что вы описываете, используя атрибуты для маркировки точек впрыска в коде, только разница что он делает это во время компиляции.
Но вы также можете делать это во время выполнения, не меняя тела методов, а используя классы, полученные из ContextBoundObject, который является классом .Net который позволяет перехватить все вызовы, сделанные против него. Ниже приведена статья .NET unmanaged API профилирования для перехвата метода JIT-ing и замены методов тела перед JIT-ing.
Этот метод успешно используется JustMock (Telerik) для издевательства, статических методов, не виртуальных методов и даже закрытых классов.
Ответ 2
Вы не можете изменить существующий метод во время выполнения, но вы можете создать его с помощью кода DOM на лету и выполнить его. Или вы могли бы объединить строки кода и скомпилировать его в памяти и запустить это.
Я сам сделал последнее (приложение, которое я разрешил собственный код С#, который был скомпилирован и выполнен в памяти, время выполнения).
Ответ 3
Если вы хотите добавить аспекты до или после вызова, посмотрите PostSharp: http://www.postsharp.org/
Ответ 4
A несколько схожий вопрос был задан ранее (хорошо, поэтому мое решение было несколько схожим). PostSharp уже упоминалось, но есть и это очень применимое Статья LinFu по CodeProject Я нашел интересным, исследуя проблему.
Ответ 5
Планируете ли вы сделать это для произвольных типов? Я бы предположил, что не получил, что вы собираетесь украсить методы атрибутом.
Учитывая это, я бы подумал, что лучшим подходом было бы определение абстрактных методов в суперклассе для ваших типов. Метод суперкласса может содержать код метода котельной пластины и делегировать конкретные реализации посредством абстрактных методов для индивидуального поведения этого метода.
В общем говоря, если вы не входите в создание файлов кода и не компилируете динамические сборки во время выполнения, то то, что вы ищете, не может быть выполнено. Вероятнее всего, существуют гораздо более практические принципы и модели ОО, которые можно использовать для достижения близкого к одному и тому же результату.