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# - 您需要修改代码以使其在其他地方工作。