替换不同类型的节点 - 删除包装块,只留下内部表达式

时间:2016-03-18 07:51:18

标签: c# roslyn roslyn-code-analysis

在CodeFixProvider中,我需要删除包装if-condition(例如):

if (temp == null)
{
    temp = new Temp();  
}

我想只留下调整后的内在表达:

// I want to change the inner expression as well
temp = anotherTemp()

一旦我尝试用行符号语句替换'if-block'的节点,就会抛出'无法强制转换'异常。 你知道这样做的正确方法吗?

1 个答案:

答案 0 :(得分:0)

我发现的唯一解决方案是在if-condition块之前插入调整后的内部表达式,然后删除该块。 要成功地做到这一点,你必须跟踪父块节点,否则它将无法工作。

  IfStatementSyntax originalIfStatement = parentIfStatement;
  root = root.TrackNodes(originalParentIfStatement);
  parentIfStatement = root.GetCurrentNode(originalParentIfStatement);
  root = root.InsertNodesBefore(parentIfStatement, new[] { SyntaxFactory.ExpressionStatement(newExpression) });
  parentIfStatement = root.GetCurrentNode(originalParentIfStatement);
  root = root.RemoveNode(parentIfStatement, SyntaxRemoveOptions.KeepNoTrivia);

如果有任何错误,请告诉我。