我想知道在使用Roslyn编译器分析代码时,怎么可能检测到长度(行数)。目前,我正在制定一项禁止使用超过10行的lambdas的法律。
查看下面的示例,我怎么知道简单的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();
EDITS 我想知道的是,我们可以清楚地知道第一个例子和下面一个例子中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表达式内容并确切知道代码编写行数的方法。
答案 0 :(得分:5)
听起来您知道如何访问相关的语法节点(SimpleLambdaExpressionSyntax
和ParenthesizedLambdaExpressionSyntax
),只需知道它们有多长。
我想你只想要这样的东西:
var lineSpan = node.SyntaxTree.GetMappedLineSpan(node.Span);
var lines = lineSpan.EndLinePosition.Line - lineSpan.StartLinePosition.Line + 1;
可能有一种更有效或更简单的方法,但这应该让你开始。