1

我有一个 CodeMethodInvokeExpression,我希望将其用作()=><[function call]>.

例如:Task.Run(()=><[My CodeMethodInvokeExpression]>)

为了清楚起见,CodeMethodInvokeExpression 可能非常复杂,例如调用带有 out 和 ref 参数的泛型方法,因此尝试编写解析它的东西可能非常复杂。

所以问题是:

  1. 可能有一种 CodeDom 方法可以做到这一点吗?
  2. 可能有一种 CodeDom 方法来获取 CodeMethodInvokeExpression 的字符串表示,因此我可以将其用作 CodeSnippetExpression。
4

1 回答 1

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

于 2015-04-20T07:51:05.350 回答