c# - 如何使用 Roslyn 否定 ExpressionSyntax

标签 c# roslyn visual-studio-extensions

我正在制作与 this 相关的 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 '!'在当前上下文中不存在”。

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

最佳答案

您可以使用 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 ,它将提供对任意表达式的调用:

Screenshot of RoslynQuoter

关于c# - 如何使用 Roslyn 否定 ExpressionSyntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59504994/

相关文章:

c# - Marshal.GetFunctionPointerForDelegate 如何作用于实例成员?

c# - Visual Studio 代码编辑器的垂直滚动条中的方 block 代表什么?

MSBuildWorkspace 无法将带有 <ProjectReference> 的项目编译到另一个项目

visual-studio - VS Image Watch 扩展 natvis 用于 BITMAPINFOHEADER?

visual-studio - 在多台计算机之间同步 Visual Studio 2013 中的扩展

c# - WinForms 中 Anchor 和 Dock 属性是否互斥?

c# - String.Format 在这种情况下如何工作?

.net - 如果我使用 Roslyn 通过 Visual Studio 2014 构建当前的 .NET 项目,我会体验到构建性能的提升吗?

c# - Roslyn:为什么许多 SymbolDisplay 方法在 ISymbol 上有等效的实例对应物?

visual-studio - 特定文件的 Visual Studio 自定义编辑器