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

Удалить ниже последней строки

Вместо Delete вы можете использовать Clear или, если вы хотите сохранить форматирование ниже последней строки, вы можете использовать ClearContents.

Код

Option Explicit

Sub DelRows()

    Const cSheet As Variant = "Sheet1"  ' Worksheet Name/Index
    Const cColumn As Variant = "G"      ' Cirteria Column Letter/Number

    Dim lastR As Long   ' Last Row

    With ThisWorkbook.Worksheets(cSheet)
        lastR = .Cells(.Rows.Count, cColumn).End(xlUp).Row
        .Range(.Cells(lastR + 1, 1), .Cells(.Rows.Count, 1)).EntireRow.Delete
    End With

End Sub
12
задан DuckMaestro 30 October 2008 в 01:38
поделиться

5 ответов

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

Но можно также сделать это во времени выполнения не путем изменения тел метода, а при помощи классов, полученных из ContextBoundObject, который является классом .NET, который позволяет Вам прервать все вызовы, выполненные против него. Вот статья MSDN Magazine, описывающая, как сделать использование AOP ContextBoundObject. (Проверьте аспекты в часть .NET статьи),

И как третья опция можно использовать динамическую генерацию кода (Отражение. Испустите или CodeDom) в сочетании с атрибутами и виртуальными методами для динамичной генерации производных классов, где можно ввести код, но это - самый болезненный способ сделать это.

Править:

Существует дальше опция использовать .NET неуправляемый профильный API для прерывания луга JIT метода и тел метода замены перед лугом JIT. Эта техника успешно используется JustMock (Telerik) для насмешки, статические методы, не виртуальные методы и даже запечатанные классы.

9
ответ дан 2 December 2019 в 20:43
поделиться

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

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

3
ответ дан 2 December 2019 в 20:43
поделиться

Несколько подобный вопрос задали ранее (хорошо, таким образом, мое решение было несколько аналогично). PostSharp был уже упомянут, но существует также эта очень применимая статья LinFu о CodeProject, который я нашел интересным при исследовании проблемы.

1
ответ дан 2 December 2019 в 20:43
поделиться

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

2
ответ дан 2 December 2019 в 20:43
поделиться

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

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

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

0
ответ дан 2 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: