如何获得声明的变量和其他定义



我正在使用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,其中条款不会给出预期的结果。

还有更多的反射方法可能会根据您想要找到的所有内容而有用,例如GetMethodsGetEvents。如果您想要所有内容,那么有一个GetMembers请参阅类型方法。

我希望有人可以提供更简单的方法。

最新更新