如何使用 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,它将提供对任意表达式的调用:
我正在制作与
有一个包含 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,它将提供对任意表达式的调用: