我正在使用Roslyn脚本嵌入式替补中的API,我不时需要知道当前会话中已定义了哪些变量,也需要所有其他定义(类,接口,interfaces。..)以及哪些引用和导入的名称空间。
我在API中找不到任何东西可以给我这样的信息,我知道它在某个地方。
剂量脚本API使用一些异常的实现,例如每次都会更新内存组件?如果是这样,如何访问该组件。
我不知道是否有罗斯琳特定的API,但是看起来您可以使用反射获取信息。这有点繁琐。我正在使用Visual Studio中的REPL来近似您的情况。
using System.Reflection;
Assembly.GetExecutingAssembly().DefinedTypes
表明,循环的每一个迭代都有一种类型,以及定义的类别的其他类型。幸运的是,Submission
类型的编号为后一个提交的数字,即Submission#11
是在Submission#5
之后。
在depl中定义的变量显示为会话类型中的字段,与定义其定义的循环的执行相对应。查看类型中所有定义变量的呼叫如下:
chosenType.GetFields(BindingFlags.Instance | BindingFlags.Public)
Roslyn Repl允许您重新解放变量,掩盖了先前从新来的呼叫者中声明的变量。现在,将"会话"视为所有提交的堆栈(最古老的是底部)。如果您向下沿堆栈进行穿越,则第一次出现给定的字段名称将是带有该名称中该名称的Active变量。检索到的字段信息除名称外提供了类型。
这是一个示例会话(包括输出),显示如何在会话中看到所有变量。
> using System.Reflection;
> var a = 1;
> var b = "c";
> var c = from type in Assembly.GetExecutingAssembly().DefinedTypes.Reverse()
from variable in type.GetFields(BindingFlags.Instance | BindingFlags.Public)
select variable;
> foreach (var info in c ) {
if (info.FieldType != typeof(Roslyn.Services.InteractiveHostObject)) {
Console.WriteLine(info);
}
}
System.Collections.Generic.IEnumerable`1[System.Reflection.FieldInfo] c
System.String b
Int32 a
如果同名出现两次,则是列出的第一个名称是会话中的一个。上述返回的类型恰好被订购为最年轻的事实。您可能想自己分类以确保。
出于何种原因(也许是错误?),我必须使用foreach循环中的语句使用LINQ,其中条款不会给出预期的结果。
还有更多的反射方法可能会根据您想要找到的所有内容而有用,例如GetMethods
和GetEvents
。如果您想要所有内容,那么有一个GetMembers
请参阅类型方法。
我希望有人可以提供更简单的方法。