我正在进行与this问题相关的VS扩展。
[包含ExpressionSyntax
的Equals(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:名称'!'在当前上下文中不存在”。
任何想法如何执行(理论上简单的操作)?
您将为此目的使用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)
,它将为任意表达式提供调用: