我有一个CodeMethodInvokeExpression,我希望将其用作()=><[function call]>
。
例如:Task.Run(()=><[My CodeMethodInvokeExpression]>)
。
而且要明确的是,CodeMethodInvokeExpression可能非常复杂,例如调用带有out和ref pramaeters的泛型方法,因此尝试编写解析它的东西可能会非常复杂。
所以问题是:
答案 0 :(得分:1)
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# - 您需要修改代码以使其在其他地方工作。