我正在使用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 回答
你不能以通用的方式 .
首先它可以简化为Halting Problem你知道
num
是否会收到一个值,填充它的代码可能会抛出或者进入一个无限循环 .其次它可能不是在运行时之前可以知道的东西:它可能是从每次返回随机值的方法初始化,调用web服务或给出当天的天气......
在某些情况下(如你所描述的那样)可以解决这个问题,但是当roslyn包含一些Static Analysis算法(如DataFlowAnalysis)时,我认为它不包含这个算法 .
如果您自己做,请注意参考别名:
什么是
num
?