Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过roslyn找到变量的值_C#_Roslyn - Fatal编程技术网

C# 如何通过roslyn找到变量的值

C# 如何通过roslyn找到变量的值,c#,roslyn,C#,Roslyn,我正在用Roslyn做一个诊断分析仪。我想得到正在分析的代码中一个变量的值。 例如获取此代码中变量num的值: int[] a = { 1, 2, 3 }; int[] num = a; Person person1 = new Person("bob", num); 我尝试通过创建一个新的编译单元来动态编译代码 SyntaxTree compilationUnitTree = SyntaxTree.ParseText( @"using System;

我正在用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
是否会收到值,例如,填充它的代码可能抛出或进入无限循环

其次,它可能不是运行前就知道的东西:它可能是通过每次返回随机值、调用Web服务或给出当天天气的方法初始化的

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

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

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

什么是
num

嗯。
num
的值是
a
,因为它只是指向
a
的指针。一旦找到引用,您应该分析引用的值。如何通过Roslyn诊断分析仪找到引用及其值?如果这个值是通过引用递归给出的,比如:int[]a={1,2,3};int[]b=a;int[]num=a;以此类推,同样适用于从xml文件@Herdo读取b或a的值的情况