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

如何在Roslyn语义层面获取ISymbol的修饰符?

在源代码生成器中从IPropertySymbol获取上下文修饰符(如partial)

在语义层面,ISymbol(包括IPropertySymbol)并没有直接提供获取上下文修饰符的API——因为语义符号聚焦的是代码编译后的逻辑含义,而partial这类上下文修饰符属于语法层面的声明信息,不会被纳入语义模型。

要解决这个问题,核心思路是从语义符号关联回对应的语法节点,再复用你原本在语法层面的处理逻辑:

具体实现代码

// 假设已获取目标IPropertySymbol实例
var syntaxRef = propertySymbol.DeclaringSyntaxReferences.FirstOrDefault();
if (syntaxRef != null)
{
    var propertySyntax = syntaxRef.GetSyntax() as MemberDeclarationSyntax;
    // 复用原逻辑筛选上下文修饰符
    var contextualModifiers = propertySyntax?.Modifiers
        .Where(token => token.IsContextualKeyword());
    
    // 检查是否包含partial关键字
    bool isPartial = contextualModifiers?.Any(t => t.Text.Equals("partial", StringComparison.Ordinal)) ?? false;
}

关键说明

  1. DeclaringSyntaxReferences会返回所有声明该属性的语法节点(因为分部属性可能有多个声明),如果需要处理所有分部声明,需要遍历这个集合而非只取第一个。
  2. 上下文修饰符(如partial)不属于语义符号的一部分,因此必须回到语法树中提取——这是语义模型设计的正常逻辑,因为这类修饰符不影响类型的语义行为,仅影响编译过程。

内容的提问来源于stack exchange,提问作者TRex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:34:52