我正在使用包含
的Roslyn项目让我们说脚本文件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()
{
/* ... */
}
}