我正在制作与 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 ,它将提供对任意表达式的调用:
关于c# - 如何使用 Roslyn 否定 ExpressionSyntax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59504994/