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

Roslyn诊断分析器:如何仅定位属性或属性参数位置?

解决Roslyn诊断分析器中属性及参数的精准定位问题

在Roslyn分析器里,要精准定位属性本身或其参数,别直接用整个AttributeSyntax节点的GetLocation(),而是要针对它的子节点来获取位置:

  • 仅定位属性名称(不包含参数和修饰目标)
    直接取AttributeSyntax的Name子节点的位置:

    // 假设你已经拿到了目标AttributeSyntax实例attribute
    Location attributeNameLocation = attribute.Name.GetLocation();
    

    这个位置只会覆盖属性的名称部分(比如[MyAttribute]里的MyAttribute),不会牵连到它修饰的目标或者括号里的参数。

  • 定位属性的第N个参数
    先检查属性的ArgumentList是否存在,再从Arguments集合里取对应索引的节点:

    if (attribute.ArgumentList != null && attribute.ArgumentList.Arguments.Count > 0)
    {
        // 第一个参数的位置
        Location firstArgLocation = attribute.ArgumentList.Arguments[0].GetLocation();
        // 第二个参数的位置(如果存在)
        if (attribute.ArgumentList.Arguments.Count > 1)
        {
            Location secondArgLocation = attribute.ArgumentList.Arguments[1].GetLocation();
        }
    }
    

    这样拿到的就是单个参数的精准位置,不会包含整个属性范围,也不会指向类库中属性的元数据位置。

注意:别用SemanticModel获取Symbol的Location,那会指向属性定义所在的类库源码位置,而非当前分析代码里的使用位置。始终从Syntax节点(AttributeSyntax及其子节点)获取位置,才能得到当前代码中的精准范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:30:55