Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Roslyn:从basicblock那里得到指示_C#_Roslyn_Roslyn Code Analysis_Control Flow Graph - Fatal编程技术网

C# Roslyn:从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 =

在roslyn中生成的控制流图包含块(basicblock)作为节点,每个basicblock包含一条或多条指令。对于包含多条指令的BasicBlock,我尝试获取所有指令及其类型这就是我所做的:

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