Как преобразовать делегат в строку кода? - PullRequest
1 голос
/ 10 ноября 2011

Я пытаюсь восстановить код делегата, преобразовав его в строку, но пока безуспешно):

Возьмите этот фрагмент кода, например:

Delegate del = new Delegate()
del = (MethodInvoker) delegate { MessageBox.Show("hello from delegate") };

Я хочу знать, есть ли какая-либо операция, которую я могу выполнить для del, чтобы получить строку, представляющую ее код C #.

Я думаю, что я ищу, это Сериализация, но я не уверен... Я пробовал Delegate.ToString (), но он не возвращает то, что я хочу ...

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Это вообще невозможно.

Если вы принимаете Expression<TDelegate> ( дерево выражений ) вместо обычного делегата, вы можете вызвать ToString(), чтобы получить строковое представление.
Однако компилятор может преобразовывать только лямбда-выражения (не блоки) в деревья выражений.

2 голосов
/ 10 ноября 2011

Такой опции нет.

Делегат можно рассматривать как еще один метод.Компилятор компилирует это до некоторых инструкций MSIL.В этот момент вы потеряли исходный код C # в вашей сборке и, следовательно, потеряли возможность показа самого исходного кода C #.(Существуют некоторые варианты обратного инжиниринга, но они слишком сложны).

Вы можете использовать выражения, чтобы настроить представление того, что вы хотите, и позволить среде выполнения свести его к тому, что требуется к тому времени (C #, MSIL, SQL и т. Д.).пример:

Expression<Action> expr = () => MessageBox.Show("test");

Console.WriteLine(expr.ToString()); 
// () => Show("test")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...