Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Roslyn确定二进制表达式是否为算术表达式_C#_Roslyn_Expression Trees_Code Analysis - Fatal编程技术网

C# 使用Roslyn确定二进制表达式是否为算术表达式

C# 使用Roslyn确定二进制表达式是否为算术表达式,c#,roslyn,expression-trees,code-analysis,C#,Roslyn,Expression Trees,Code Analysis,使用CSharpSyntaxRewriter,我想确定一个特定的二进制表达式是否是艺术表达式。有没有比编写下面的代码片段更简单的方法来确定这一点 private static bool IsArithmeticOperator(BinaryExpressionSyntax node) { return node.IsKind(SyntaxKind.AddExpression) || node.IsKind(SyntaxKind.MultiplyExpression) ||

使用CSharpSyntaxRewriter,我想确定一个特定的二进制表达式是否是艺术表达式。有没有比编写下面的代码片段更简单的方法来确定这一点

private static bool IsArithmeticOperator(BinaryExpressionSyntax node)
{
    return node.IsKind(SyntaxKind.AddExpression) ||
        node.IsKind(SyntaxKind.MultiplyExpression) ||
        node.IsKind(SyntaxKind.DivideExpression) ||
        node.IsKind(SyntaxKind.SubtractExpression) ||
        node.IsKind(SyntaxKind.ModuloExpression);
}

只是感觉有点笨重。

我不确定这是否可行,但枚举中有一些东西可能可以帮助您, 算术表达式在enum SyntaxKind中按顺序排列,ModuleExpression除外,您可以单独检查

也许这个范围内的其他SyntaxKind也能满足您的需求

AddExpression = 307,
SubtractExpression = 308,
MultiplyExpression = 309,
DivideExpression = 310,
IntegerDivideExpression = 311,
ExponentiateExpression = 314,
LeftShiftExpression = 315,
RightShiftExpression = 316,
ConcatenateExpression = 317,
ModuloExpression = 318,
所以你可以这样做:

private static bool IsArithmeticOperator(BinaryExpressionSyntax node)
{
    SyntaxKind expressionKind = node.Kind();
    return (expressionKind >= SyntaxKind.AddExpression && expressionKind <= SyntaxKind.DivideExpression)
    || expressionKind == SyntaxKind.ModuloExpression;
}
更新

这仅适用于Microsoft.CodeAnalysis.VisualBasic


而且不适用于Microsoft.CodeAnalysis.CSharp

我不确定这是否可行,但enum中有一些东西可能对您有所帮助, 算术表达式在enum SyntaxKind中按顺序排列,ModuleExpression除外,您可以单独检查

也许这个范围内的其他SyntaxKind也能满足您的需求

AddExpression = 307,
SubtractExpression = 308,
MultiplyExpression = 309,
DivideExpression = 310,
IntegerDivideExpression = 311,
ExponentiateExpression = 314,
LeftShiftExpression = 315,
RightShiftExpression = 316,
ConcatenateExpression = 317,
ModuloExpression = 318,
所以你可以这样做:

private static bool IsArithmeticOperator(BinaryExpressionSyntax node)
{
    SyntaxKind expressionKind = node.Kind();
    return (expressionKind >= SyntaxKind.AddExpression && expressionKind <= SyntaxKind.DivideExpression)
    || expressionKind == SyntaxKind.ModuloExpression;
}
更新

这仅适用于Microsoft.CodeAnalysis.VisualBasic


而且不适用于Microsoft.codealysis.CSharp

喜欢idea+1。不过,对于取决于具体的值有些紧张。在3.7上没有什么价值。对于Microsoft.CodeAnalysiss.CSharp,这些值稍有不同,可能破坏了依赖于上述值的任何实现。谢谢你的建议。@JamesWiseman你确定吗?这是从Microsoft.CodeAnalysis.VisualBasic SyntaxKindMine中摘取的。无可否认,我是C:喜欢这个想法+1。不过,对于取决于具体的值有些紧张。在3.7上没有什么价值。对于Microsoft.CodeAnalysiss.CSharp,这些值稍有不同,可能破坏了依赖于上述值的任何实现。谢谢你的建议。@JamesWiseman你确定吗?这是从Microsoft.CodeAnalysis.VisualBasic SyntaxKindMine中摘取的。无可否认,VisualBasic SyntaxKindMine是C: