我有一个CodeMethodInvokeExpression,我想用它作为()=><[function call]>。
例如:Task.Run(()=><[My CodeMethodInvokeExpression]>)。
而且要明确的是,CodeMethodInvokeExpression可能非常复杂,例如调用泛型方法时没有out和ref pramaeters,因此试图编写解析它的东西可能非常复杂。
所以问题是:
发布于 2015-04-20 07:51:05
CodeDom有点过时了。据我所知,您能做的最好的事情就是使用CodeSnippetExpression,但是当您拥有CodeMethodInvokeExpression时,已经太晚了--您并没有关于您试图调用的方法的真正信息,只知道它的名称、对象和参数。更不用说它一开始就违背了使用CodeDom的目的。
当然,您正在生成代码,所以您可以自己创建匿名方法,这也是编译器所做的。但是,与在CodeMethodInvokeExpression中获得的信息相比,您还需要更多的信息。到头来,你只是在兜圈子。
另外,请注意,out是C#的专长--它实际上不是CLR语言的共同特性,在其他语言中,它可能与ref相同。
请注意,您可以使用CodeDom生成代码段:
var provider = new CSharpCodeProvider();
using (var writer = new StringWriter())
{
provider.GenerateCodeFromExpression
(
new CodeMethodInvokeExpression
(
new CodeMethodReferenceExpression
(
new CodeThisReferenceExpression(),
"MyMethod",
new CodeTypeReference(typeof(string))
),
new CodeDirectionExpression(FieldDirection.Out, new CodeArgumentReferenceExpression("myArgument"))
),
writer,
null
);
writer.ToString().Dump();
}然后,此示例代码将生成以下内容:
this.MyMethod(out myArgument)
您可以在此基础上创建一个CodeSnippetExpression,手动将() =>放在前面,并将该片段用作接受委托的方法的参数。同样,这只适用于C# --您需要修改代码以使其在其他地方工作。
https://stackoverflow.com/questions/29741735
复制相似问题