使用 Roslyn 检测 lambda 表达式的长度

Detect the length of a lambda expression using Roslyn

我想知道在使用 Roslyn 编译器分析代码时如何检测长度(行数)。目前,我正在制定一项法律,禁止使用超过 10 行的 lambda。

看下面的例子,我怎么知道简单的lambda表达式语法只有一行?

        // Data source. 
        int[] scores = { 90, 71, 82, 93, 75, 82 };

        // The call to Count forces iteration of the source 
        int highScoreCount = scores.Where(n => n > 80).Count();

编辑 我想知道的是,确切知道我们在第一个示例和下面的 lambda 表达式中可以看到的行数的差异:

   1: private IEnumerable<Book> BooksPublishedBetween1991and1997()
   2: {
   3:     return Books.FindAll(Book => {
   4:  
   5:         return Book.Published >= new DateTime(1991, 01, 01) &&
   6:         Book.Published <= new DateTime(1997, 12, 31);
   7:     
   8:     });
   9: } //Link to sample :  http://www.rvenables.com/2009/03/practical-introduction-to-lambda-expressions/

更新

一直在评论里指出我的问题太笼统了。我将尽可能简化它。我在使用Roslyn之前做过代码分析来验证用户在开发客户端软件时应该有的某些开发用法。 我有一个通用的方法通过使用 SyntaxNodeAnalysisContext 对象来遍历树代码的节点(不确定它是否真的这样调用)。 我想知道的是,当我在寻找 SimpleLambdaExpressionSyntax 和 ParenthesisedLambdaExpressionSyntax 时,是查看 lambda 表达式内容并确切知道代码编写了多少行的方法。

听起来您知道如何到达相关语法节点(SimpleLambdaExpressionSyntaxParenthesizedLambdaExpressionSyntax),只需要知道它们有多长。

我想你只是想要这样的东西:

var lineSpan = node.SyntaxTree.GetMappedLineSpan(node.Span);
var lines = lineSpan.EndLinePosition.Line - lineSpan.StartLinePosition.Line + 1;

可能有更有效或更简单的方法,但这应该可以帮助您入门。