C# Roslyn:从basicblock那里得到指示
在roslyn中生成的控制流图包含块(basicblock)作为节点,每个basicblock包含一条或多条指令。对于包含多条指令的BasicBlock,我尝试获取所有指令及其类型这就是我所做的:C# Roslyn:从basicblock那里得到指示,c#,roslyn,roslyn-code-analysis,control-flow-graph,C#,Roslyn,Roslyn Code Analysis,Control Flow Graph,在roslyn中生成的控制流图包含块(basicblock)作为节点,每个basicblock包含一条或多条指令。对于包含多条指令的BasicBlock,我尝试获取所有指令及其类型这就是我所做的: var cfg = ControlFlowGraph.Create(method); foreach(var block in cfg.Blocks) { foreach(var operation in block.Operations) { var syntax =
var cfg = ControlFlowGraph.Create(method);
foreach(var block in cfg.Blocks)
{
foreach(var operation in block.Operations)
{
var syntax = operation.Syntax;
Console.WriteLine(syntax.Kind());
}
}
对于以下方法:
public int method(int x, int y)
{
y = 10;
x = y;
return x + y;
}
我得到的结果是:
ExpressionStatement
ExpressionStatement
但是我想得到精确的指令和它的类型,例如指令x=y代码>我想获取AssignmentExpressionSyntax
。
此外,我还想根据每条指令的类型对其执行一些操作。因为您正在查看语法类型,所以ExpressionStatement是该语句的正确类型。通过查看ExpressionStatement中表达式的种类,可以找到表达式的种类
if(operation.Syntax是ExpressionStatement es)
{
var kind=es.Expression.kind();
}
但是,如果您使用的是操作(IOOperation),则可以跳过语法并使用OperationKind来获得更好的信息 这就是我一直在寻找的答案,我刚刚将ExpressionStatement更改为ExpressionStatementSyntax