我正在尝试用Roslyn重写代码.我想将GreaterThanToken更改为EqualsEqualsToken.到目前为止,这是我的代码:
public class ToParse
{
public bool MethodToConvert(int param)
{
return (1 > param);
}
}
Run Code Online (Sandbox Code Playgroud)
执行后,Console.WriteLine打印更改的标记return (1 == param);
但是当我用ilspy打开testassembly.dll时,我仍然看到return 1 > param;
任何建议?
[注意:你使用的是较旧版本的Roslyn.这个答案也适用于该版本,但我可以通过更新的名称引用类和成员,以便它们与CodePlex上可用的源匹配.
您解析的原始树包含一个BinaryExpressionSyntax带有a SyntaxKind的节点GreaterThanExpression.当你换出GreaterThanToken用EqualsEqualsToken
这里面BinaryExpressionSyntax,它并不会自动调整含有SyntaxNode的一种来EqualsExpression.
结果,你最终得到了GreaterThanExpression一个EqualsEqualsToken.由于这不是编译器本身可以合法生成的语法树,因此您可能会看到类似的意外行为.
要在这种情况下生成正确的树,我建议通过覆盖CSharpSyntaxRewriter.VisitBinaryExpression并执行以下操作来重写节点本身而不是令牌:
public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node)
{
if (node.CSharpKind() == SyntaxKind.GreaterThanExpression)
{
return SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, node.Left, node.Right);
}
return node;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1352 次 |
| 最近记录: |