我正在使用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获取变量的值?
答案 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
?