Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将委托转换为代码字符串?_C#_String_Parsing_Delegates - Fatal编程技术网

C# 如何将委托转换为代码字符串?

C# 如何将委托转换为代码字符串?,c#,string,parsing,delegates,C#,String,Parsing,Delegates,我试图通过将委托转换为字符串来恢复委托的代码,但迄今为止没有成功): 以这段代码为例: Delegate del = new Delegate() del = (MethodInvoker) delegate { MessageBox.Show("hello from delegate") }; 我想知道我是否可以在del上执行任何操作来检索表示其C代码的字符串 我想我要找的是序列化,但我不确定。。。 我尝试了Delegate.ToString(),但它没有返回我想要的…这通常是不可能的 如果

我试图通过将委托转换为字符串来恢复委托的代码,但迄今为止没有成功):

以这段代码为例:

Delegate del = new Delegate()
del = (MethodInvoker) delegate { MessageBox.Show("hello from delegate") };
我想知道我是否可以在
del
上执行任何操作来检索表示其C代码的字符串

我想我要找的是序列化,但我不确定。。。
我尝试了Delegate.ToString(),但它没有返回我想要的…

这通常是不可能的

如果接受
表达式(an)而不是普通委托,则可以调用
ToString()
来获取字符串表示形式。

但是,编译器只能将lambda表达式(而不是块)转换为表达式树。

这通常是不可能的

如果接受
表达式(an)而不是普通委托,则可以调用
ToString()
来获取字符串表示形式。

但是,编译器只能将lambda表达式(而不是块)转换为表达式树。

没有此类选项

委托可以看作是另一种方法。编译器将其编译为一些MSIL指令。此时,程序集中的原始C#源代码丢失了,因此,无法显示原始C#代码本身。(有一些逆向工程选项,但这些都很复杂)

您可以使用表达式来设置所需内容的表示形式,并让运行时将其归结为当时所需的任何内容(C#、MSIL、SQL等)。例如:

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

Console.WriteLine(expr.ToString()); 
// () => Show("test")
expressionexpr=()=>MessageBox.Show(“测试”);
Console.WriteLine(expr.ToString());
//()=>显示(“测试”)

没有这样的选项

委托可以看作是另一种方法。编译器将其编译为一些MSIL指令。此时,程序集中的原始C#源代码丢失了,因此,无法显示原始C#代码本身。(有一些逆向工程选项,但这些都很复杂)

您可以使用表达式来设置所需内容的表示形式,并让运行时将其归结为当时所需的任何内容(C#、MSIL、SQL等)。例如:

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

Console.WriteLine(expr.ToString()); 
// () => Show("test")
expressionexpr=()=>MessageBox.Show(“测试”);
Console.WriteLine(expr.ToString());
//()=>显示(“测试”)

您能详细说明为什么要这样做吗?可能有更好/更简单的方法来实现您的目标。在.net framework中没有任何内容可以满足您的要求。最接近的是reflectional那么,为什么将
del
设置为
new Delegate()
只是为了替换下一行上的值?为什么要将委托转换为字符串?仅仅
new Delegate()
不起作用
Delegate
没有公共的无参数构造函数。您能详细说明一下为什么要这样做吗?可能有更好/更简单的方法来实现您的目标。在.net framework中没有任何内容可以满足您的要求。最接近的是reflectional那么,为什么将
del
设置为
new Delegate()
只是为了替换下一行上的值?为什么要将委托转换为字符串?仅仅
new Delegate()
不起作用
Delegate
没有公共的无参数构造函数。您能给我一个使用示例吗?
表达式lambda=num=>num<5
@SLaks如何将字符串转换回lambda表达式?我可以将委托转换为表达式吗?@ojlovecd:这是不可能的;该字符串可能引用闭包中的变量。如果没有,你需要一个解析器;Roslyn会帮忙的。你能给我举个用法的例子吗?
表达式lambda=num=>num<5
@SLaks如何将字符串转换回lambda表达式?我可以将委托转换为表达式吗?@ojlovecd:这是不可能的;该字符串可能引用闭包中的变量。如果没有,你需要一个解析器;罗斯林会帮忙的。