如何使用Roslyn否定ExpressionSyntax

问题描述 投票:1回答:1

我正在进行与this问题相关的VS扩展。

[包含ExpressionSyntaxEquals(o1, o2),有时我想将其取反为!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);
        }

但是它给出了错误:“信息=错误CS0103:名称'!'在当前上下文中不存在”。

任何想法如何执行(理论上简单的操作)?

c# roslyn visual-studio-extensions
1个回答
0
投票

您将为此目的使用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调用,建议使用工具SyntaxFactory.PrefixUnaryExpression(SyntaxKind, ExpressionSyntax),它将为任意表达式提供调用:

Roslyn Quoter

© www.soinside.com 2019 - 2024. All rights reserved.