Roslyn:如何在没有反射的情况下调用编译器生成的类方法

时间:2017-04-21 18:53:19

标签: c# scripting roslyn

我正在使用包含

的Roslyn项目
  • A)包含SourceCodeKind = Script和
  • 的文档
  • B)另一份文件 使用SourceCodeKind = Regular

让我们说脚本文件A)只包含

public string myScriptFunction()
{
    /* ... */
}

编译完成后,Roslyn会将脚本代码转换为一个类" MyScriptClass"它包含上面的方法和一些初始化方法 - 具体来说,一个名称为"< Initialize>" (详见最底部的代码)。

是的,而常规文件B)就像是

class MyRegularClass
{
    async void go()
    {
        var script = new MyScriptClass();  // This works
        await script.<Initialize>(); // whoops.. can't do! won't compile due to the invalid method name. Can do via reflection, but that seems bad.
    }
}

在编译项目时,上面的注释已经说明了会发生什么:我可以很好地实例化MyScriptClass,所以无论Roslyn如何将我的脚本文件的语法转换为实际的C#似乎已经发生了。 但我无法访问其&lt; Initialize&gt;方法,因为它显然包含无效字符(&lt;,&gt;),而Roslyn似乎仍然在那时进行这种健全性检查。

我的问题基本上是:我可以以任何方式生成文档B的代码,可以直接调用&lt; Initialize&gt;方法? 我的项目/文档的任何设置将禁用此检查,任何编译器指令,或任何生成代码本身的方法来绕过这个?

目前,我已经退回到使用反射进行此调用,这很好 - 但如果有任何方式,我当然希望直接调用该方法。

供参考,以下是Roslyn对脚本文件A)的语法转换大致如下:

internal sealed class MyScriptClass
{
     private sealed class <<Initialize>>d__0 : IAsyncStateMachine
     {
       /* .... */
     }

     internal Task<object> <Initialize>()
     {
       /* .... */
     }

     public string myScriptFunction()
     {
       /* ... */
     }
}

0 个答案:

没有答案