繁体   English   中英

如何通过 roslyn 找到变量的值

[英]How can i find the value of a variable through roslyn

我正在使用 Roslyn 制作诊断分析仪。 我想获取正在分析的代码中变量的值。 比如在这段代码中获取变量num的值:

int[] a = { 1, 2, 3 };
int[] num = a;
Person person1 = new Person("bob", num);

我已经尝试通过创建一个新的编译单元来即时编译代码,

SyntaxTree compilationUnitTree = SyntaxTree.ParseText(
            @"using System;
             namespace HelloWorld
            {
                class Program
                {
                    static void Main(string[] args)
                    {
                        int[] a = { 1, 2, 3 };
                        int[] num = a;
                    }
                }
            }");
 var compilation = CSharpCompilation.Create("MyCompilation", syntaxTrees: new[] { compilationUnitTree });
 var semanticModel = compilation.GetSemanticModel(compilationUnitTree);

但我无法得到它的价值。 我也尝试过使用 SemanticModel 的 DataFlowAnalysis,我能够成功检查属性,例如值是否为常量等。但是当我检查num值时,它给出a而不是我所期望的({1,2,3 })。

有什么办法可以使用 Roslyn 获取变量的值吗?

你不能以通用的方式。

首先,它可以简化为您无法知道程序是否完成的停机问题,因此您无法知道num是否会收到一个值,例如填充它的代码可能会抛出或进入无限循环。

其次,它可能不是在运行时之前就可以知道的:它可能是从每次返回随机值的方法初始化的,调用网络服务或提供当天的天气......

在某些情况下可以解决这个问题(比如你描述的那个),但是虽然 roslyn 包含一些静态分析算法(比如 DataFlowAnalysis),但我认为它不包含这个算法。

如果您自己这样做,请注意引用别名:

int[] a = { 1, 2, 3 };
int[] b = a;
b[2] = 8;
b = a;
int[] num = a;

什么是num

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM