C # Reflection, изменение тела метода - PullRequest
5 голосов
/ 05 сентября 2010

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

class Person
{
    public void DoSth()
    { Console.WriteLine("Hello!"); }
}

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

Текстовое поле может содержать такие данные как:

for (int i = 0; i < 5; i++)
     Console.WriteLine(i);

, которые должны быть исключены при вызове

new Person().DoSth()

.

Есть (или как есть)это возможно в C # (с помощью Reflection)?
Спасибо за вашу помощь заранее.

РЕДАКТИРОВАТЬ:
Если вышеописанное невозможно, возможно ли создать новый метод во время выполнения и вызватьэто?

Ответы [ 3 ]

5 голосов
/ 05 сентября 2010

Reflection.Emit - это один из способов генерации IL во время выполнения ... http://msdn.microsoft.com/en-us/library/8ffc3x75(v=VS.90).aspx

Легкая генерация кода это еще один ... http://blogs.msdn.com/b/joelpob/archive/2004/03/31/105282.aspx

Однако, не берите C # и не компилируйте его. Для этого вам, скорее всего, потребуется вызвать компилятор C #.

Каков ваш вариант использования (почему вы хотите это сделать)? Существуют соображения безопасности при запуске кода в домене приложения, поэтому вам нужно решить, как с этим справиться.

2 голосов
/ 05 сентября 2010

Вы не можете изменить тело метода во время выполнения. Там нет ничего, что позволяет вам сделать это. Лучшее, что вы можете сделать, это испустить новый метод.

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

Это не отражение.

Посмотрите на аспектно-ориентированное программирование, которое может помочь вам получить аналогичные результаты:

http://csharp -source.net / open-source / аспектно-ориентированный-frameworks

...