如何使用CodeDom生成内联动态方法?

时间:2015-04-20 07:32:38

标签: .net codedom codegen

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

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

而且要明确的是,CodeMethodInvokeExpression可能非常复杂,例如调用带有out和ref pramaeters的泛型方法,因此尝试编写解析它的东西可能会非常复杂。

所以问题是:

  1. 可能有CodeDom这样做吗?
  2. 可能有CodeDom获取CodeMethodInvokeExpression的字符串表示形式的方法,所以我可以将它用作CodeSnippetExpression。

1 个答案:

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