首页 文章

如何通过roslyn找到变量的值

提问于
浏览
2

我正在使用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);

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

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

1 回答

  • 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

相关问题