![](/img/trans.png)
[英]Roslyn - How can I get all references of a variable at DiagnosticAnalyzer class?
[英]How can i find the value of a variable through roslyn
我正在使用 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
是否会收到一个值,例如填充它的代码可能会抛出或进入无限循环。
其次,它可能不是在运行时之前就可以知道的:它可能是从每次返回随机值的方法初始化的,调用网络服务或提供当天的天气......
在某些情况下可以解决这个问题(比如你描述的那个),但是虽然 roslyn 包含一些静态分析算法(比如 DataFlowAnalysis),但我认为它不包含这个算法。
如果您自己这样做,请注意引用别名:
int[] a = { 1, 2, 3 };
int[] b = a;
b[2] = 8;
b = a;
int[] num = a;
什么是num
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.