You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:35:20