您可能知道,当我们在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
}
答案 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
委托也基本上是(类型安全的)函数指针。这意味着它指向函数并且不包含它。
如果你真的想要理解这个问题,你需要理解编译器和解释器之间的区别(参见上面的两个链接)。