如何优化提取PropertyDeclarationSyntax与MethodDeclarationSyntax名称的代码?
问题描述
在C#语法分析场景中,PropertyDeclarationSyntax和MethodDeclarationSyntax都包含Identifier属性,但它们的共同基类CSharpSyntaxNode并没有定义这个属性。需要实现一个方法,接收CompilationUnitSyntax对象,从中提取所有这两种类型的节点,并将它们的名称存入列表,同时要避免重复代码。
当前已有代码仅处理了MethodDeclarationSyntax类型,不想用字符串参数分支判断这种冗余的实现方式。
解决方案1:LINQ联合查询+模式匹配
直接通过LINQ筛选目标节点,用模式匹配统一提取名称,代码简洁直观:
static List<string> GrabNames(CompilationUnitSyntax root) { return root.DescendantNodes() .Where(node => node is MethodDeclarationSyntax or PropertyDeclarationSyntax) .Select(node => node switch { MethodDeclarationSyntax method => method.Identifier.Text, PropertyDeclarationSyntax property => property.Identifier.Text, _ => string.Empty // 实际不会触发,因为前面已经过滤了类型 }) .ToList(); }
解决方案2:提取公共逻辑到辅助方法
如果后续要支持更多带Identifier的节点类型,把提取逻辑抽成单独方法,便于维护:
static string GetNodeIdentifier(CSharpSyntaxNode node) { return node switch { MethodDeclarationSyntax method => method.Identifier.Text, PropertyDeclarationSyntax property => property.Identifier.Text, _ => throw new ArgumentException("不支持的节点类型", nameof(node)) }; } static List<string> GrabNames(CompilationUnitSyntax root) { return root.DescendantNodes() .Where(node => node is MethodDeclarationSyntax or PropertyDeclarationSyntax) .Select(GetNodeIdentifier) .ToList(); }
解决方案3:扩展方法实现复用
如果项目中多处需要提取这类节点的名称,用扩展方法封装逻辑,复用性更强:
public static class SyntaxNodeExtensions { public static string GetIdentifierText(this CSharpSyntaxNode node) { return node switch { MethodDeclarationSyntax method => method.Identifier.Text, PropertyDeclarationSyntax property => property.Identifier.Text, // 后续可添加FieldDeclarationSyntax等其他带Identifier的节点类型 _ => throw new InvalidOperationException("该节点不包含Identifier属性") }; } } // 调用方式 static List<string> GrabNames(CompilationUnitSyntax root) { return root.DescendantNodes() .Where(node => node is MethodDeclarationSyntax or PropertyDeclarationSyntax) .Select(node => node.GetIdentifierText()) .ToList(); }
内容的提问来源于stack exchange,提问作者user32882
相关产品推荐
相关产品推荐

