gpt4 book ai didi

c# - 如何获取声明的变量和其他定义

转载 作者:太空狗 更新时间:2023-10-30 00:54:23 27 4
gpt4 key购买 nike

我在嵌入式 REPL 中使用 Roslyn 脚本 API,有时我需要知道在当前 session 中定义了哪些变量,还需要了解所有其他定义(类、接口(interface)...)以及引用和导入的内容命名空间。

我在 API 中找不到任何东西可以给我那种信息,我知道它就在那里。

Dose Scripting API 使用了一些不寻常的实现,比如每次都更新内存中的程序集?如果是这样,如何访问该程序集。

最佳答案

我不知道是否有特定于 Roslyn 的 API,但看起来您可以使用反射获取信息。这有点麻烦。我在 Visual Studio 中使用 REPL 来估计您的情况。

using System.Reflection;

Assembly.GetExecutingAssembly().DefinedTypes

显示循环的每次迭代都有一个类型以及一些额外的类定义。幸运的是,Submission 类型被编号,后面的提交具有更高的编号,即 Submission#11Submission#5 之后。

REPL 中定义的变量显示为 session 类型中的字段,对应于定义它的循环的执行。查看类型中所有已定义变量的调用如下:

chosenType.GetFields(BindingFlags.Instance | BindingFlags.Public)

Roslyn REPL 允许您重新声明变量,对新调用者屏蔽之前声明的变量。现在将“ session ”视为所有提交的堆栈(最旧的在底部)。如果向下遍历堆栈,给定字段名称的第一次出现将是 REPL 中具有该名称的事件变量。检索到的字段信息除了提供名称外还提供类型。

这是一个示例 session (包括输出),展示了如何查看 session 中声明的所有变量。

> 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

如果相同的名称出现两次,则列出的第一个是 session 中可用的。上面利用了类型返回恰好是从最老到最年轻的顺序这一事实。您可能希望自己对其进行排序以确保安全。

无论出于何种原因(可能是错误?)我必须在 foreach 循环中使用 if 语句,使用 LINQ where 子句不会给出预期的结果。

根据您要查找的内容,还有更多反射方法可能有用,例如 GetMethodsGetEvents。如果您想要一切,那么有一个 GetMembers 请参阅 Type Methods .

希望有人能提供更简单的方法。

关于c# - 如何获取声明的变量和其他定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com