首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CodeDom生成内联动态方法?

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

Stack Overflow用户
提问于 2015-04-20 07:32:37
回答 1查看 309关注 0票数 1

我有一个CodeMethodInvokeExpression,我想用它作为()=><[function call]>

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

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

所以问题是:

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

回答 1

Stack Overflow用户

发布于 2015-04-20 07:51:05

CodeDom有点过时了。据我所知,您能做的最好的事情就是使用CodeSnippetExpression,但是当您拥有CodeMethodInvokeExpression时,已经太晚了--您并没有关于您试图调用的方法的真正信息,只知道它的名称、对象和参数。更不用说它一开始就违背了使用CodeDom的目的。

当然,您正在生成代码,所以您可以自己创建匿名方法,这也是编译器所做的。但是,与在CodeMethodInvokeExpression中获得的信息相比,您还需要更多的信息。到头来,你只是在兜圈子。

另外,请注意,out是C#的专长--它实际上不是CLR语言的共同特性,在其他语言中,它可能与ref相同。

请注意,您可以使用CodeDom生成代码段:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29741735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档