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
相关产品推荐
相关产品推荐

