如何通过roslyn找到变量的值

时间:2015-07-01 14:17:11

标签: c# 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获取变量的值?

1 个答案:

答案 0 :(得分:2)

你不能以通用的方式。

首先它可以缩减到Halting Problem你不知道程序是否完成所以你不知道num是否会收到一个值,填充它的代码可能会抛出示例或进入无限循环。

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

问题可以在某些情况下解决(就像你描述的那样),但是当roslyn包含一些Static Analysis算法(比如DataFlowAnalysis)时,我认为它不包含这个算法。

如果您自己这样做,请注意参考别名:

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

什么是num