如何获取分配给委托的函数字符串

时间:2009-10-29 17:42:37

标签: c# delegates

您可能知道,当我们在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 个答案:

答案 0 :(得分:1)

简而言之,你不能(真的)。

那是因为你在javascript中看到的实际上是一个对象,而不仅仅是一个函数,而C#代码产生一个可以调用的(编译)函数。

您拥有的一些选项:

  • 通过反射获取函数的元数据;这不会暴露函数内部的任何功能。

  • 更进一步反编译该函数(如Reflector所做的那样),仍然不会产生原始来源,但是它的副本应该做同样的事情。

  • 保留源代码并“按需”编译,但这也需要您进行一些互动。

答案 1 :(得分:1)

解释Javascript,编译C#。在解释型语言中,在为编译语言部署已编译的二进制文件时部署源代码。没有消息来源了。您可以通过补充来解析方法并重建源代码,但这不一样。

编辑:

如果您编译C#文件,则会获得exe或dll或其他任何内容。这是二进制可执行代码,没有源代码。另一方面,Javascript始终只是文本,源代码。如果您将JS嵌入到网页中,则仍然可以读取代码。尝试使用文本编辑器读取exe或dll。你不能这样做。它的二进制文件,源代码消失了。这就是为什么你不能打印你的方法的来源。

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

委托也基本上是(类型安全的)函数指针。这意味着它指向函数并且不包含它。

如果你真的想要理解这个问题,你需要理解编译器和解释器之间的区别(参见上面的两个链接)。