C# 如何通过roslyn找到变量的值
我正在用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;
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的值的情况