如何使用 Roslyn 否定 ExpressionSyntax

How to negate ExpressionSyntax using Roslyn

我正在制作与 问题相关的 VS 扩展。

有一个包含 Equals(o1, o2)ExpressionSyntax,有时我想将它取反为 !Equals(o1, o2)。 我还没有真正找到否定表达式的方法,所以我即兴发挥。

到目前为止,我尝试过:

        private static InvocationExpressionSyntax Negate(ExpressionSyntax invocation)
        {
            var syntaxList = new SeparatedSyntaxList<SyntaxNode>();
            var argumentList = SyntaxFactory.ArgumentList(syntaxList).AddArguments(SyntaxFactory.Argument(invocation));
            var negation = SyntaxFactory.InvocationExpression(SyntaxFactory.IdentifierName("!"), argumentList);
            return SyntaxFactory.InvocationExpression(negation);
        }

但它给出了错误:"Info = error CS0103: The name '!' does not exist in the current context"。

知道如何执行这个(理论上简单的操作)吗?

您将 PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, ...) 用于此目的。

例如来自 ContractCSharpSyntaxRewriter.cs#L272

using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

private ExpressionSyntax InverseExpressionWithNot(ExpressionSyntax checkExpression)
{
    if (checkExpression == null)
    {
        throw new ArgumentNullException(nameof(checkExpression));
    }

    return PrefixUnaryExpression(SyntaxKind.LogicalNotExpression, ParenthesizedExpression(checkExpression));
}

另请参阅 MSDN SyntaxFactory.PrefixUnaryExpression(SyntaxKind, ExpressionSyntax)

如果对于另一个表达式,您需要确定所需的 Roslyn 调用,我推荐工具 Roslyn Quoter,它将提供对任意表达式的调用: