Как получить строку функции, назначенную делегату - PullRequest
1 голос
/ 29 октября 2009

Как вы, возможно, знаете, когда у нас есть этот код в Javascript:

function getName()
{
  var getName = "Hello";
  return getName;
}

var NameString = getName;

alert(NameString.toString());

вернется;

function getName()
{
  var getName = "Hello";
  return getName;
}

в виде строки, а не в результате вызова функции.

Как я могу сделать то же самое в C #?

Например, как получить коды функций, назначенные для Delegate?

Заранее спасибо.

(P.s: Я думаю, что мне, возможно, придется использовать System.Reflection)

Внутреннее Я думает примерно так:

public string delegate PointThat();

public string TheMethod()
{
  string getName = "Hello World";
  return getName;
}

// some function signature
{
  PointThat t = TheMethod;
  t.ToString() // returns the function string rather than invocation result   
}

Ответы [ 2 ]

1 голос
/ 29 октября 2009

Javascript интерпретируется, C # компилируется.В интерпретируемых языках вы развертываете исходный код, пока вы развертываете скомпилированный двоичный файл для скомпилированных языков.Источника больше нет.Вы можете проанализировать метод через replection и восстановить исходный код, но это не одно и то же.

Edit:

Если вы компилируете свои файлы C #, вы получаете exe, dll или что-то еще.Это двоичный исполняемый код, а не исходный код.С другой стороны, Javascript - это просто текст, исходный код.Если вы встраиваете JS в веб-страницу, код все равно можно прочитать.Попробуйте прочитать exe или dll с помощью текстового редактора.Вы не можете сделать это.Его бинарный, исходный код пропал.Вот почему вы не можете распечатать источник вашего метода.

http://en.wikipedia.org/wiki/Interpreter_%28computing%29
http://en.wikipedia.org/wiki/Compiler

Кроме того, делегат в основном является (типизированным) указателем на функцию.Это означает, что он указывает на функцию и не содержит ее.

Если вы действительно хотите понять проблему, вам необходимо понять разницу между компилятором и интерпретатором (см. Две ссылки выше).

1 голос
/ 29 октября 2009

Короче говоря, вы не можете (на самом деле).

Это потому, что то, что вы видите в javascript, на самом деле является объектом, а не просто функцией, в то время как код C # дает (скомпилированную) функцию, которую можно вызывать.

Некоторые из имеющихся у вас опций:

  • Получить метаданные функции через отражение; это не раскрывает какую-либо функциональность, которая находится внутри функции.

  • Сделайте еще один шаг и декомпилируйте функцию (как это делает Reflector), однако это не дает исходный источник, но дает повтор, который должен делать то же самое.

  • Сохраните исходный код и скомпилируйте его "по требованию", но это также требует некоторого взаимодействия с вашей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...