Appearance
FAQ 分册 2:目标筛选与信息提取
Q7:ForAttributeWithMetadataName(...) 找不到我的类
- 症状:类明明写了特性,但
transform根本没进来 - 可能原因:特性全名不匹配、
predicate提前把节点过滤掉、目标类没参与当前编译 - 解决方案:先核对
fullyQualifiedMetadataName,再确认predicate没把类排掉 - 相关章节:第 6 章、第 7 章
- 相关术语:SyntaxProvider、ForAttributeWithMetadataName(...)、GeneratorAttributeSyntaxContext
Q8:SyntaxNode 和 ISymbol 有什么区别?
- 症状:看到
TargetNode、TargetSymbol、SemanticModel,但分不清该用哪个 - 可能原因:还没有建立“语法看长相,语义看含义”的分层意识
- 解决方案:先记最短口诀:
SyntaxNode看代码长什么样,符号看它真实代表什么 - 相关章节:第 7 章
- 相关术语:SyntaxNode、GeneratorAttributeSyntaxContext、SemanticModel
Q9:如何获取属性的类型信息?
- 症状:拿到了属性,但不知道怎么判断它是不是
string?、int、Nullable<int> - 可能原因:只停留在属性名,还没有进入
IPropertySymbol.Type - 解决方案:先从
IPropertySymbol.Type拿到ITypeSymbol,再看ToDisplayString()、IsValueType、NullableAnnotation - 相关章节:第 8 章、第 10 章
- 相关术语:IPropertySymbol、ITypeSymbol、NullableAnnotation
Q10:GetMembers() 返回了很多我不需要的成员
- 症状:只想拿属性,却看到了方法、字段、事件等一大堆成员
- 可能原因:
GetMembers()返回的是类型下的全部成员 - 解决方案:先
OfType<IPropertySymbol>()过滤,再按DeclaredAccessibility和GetMethod继续筛选 - 相关章节:第 8 章
- 相关术语:INamedTypeSymbol、IPropertySymbol、Accessibility
Q17:怎么读取特性参数?
- 症状:已经能用特性找到目标类,但不知道如何读取
[MyAttr("x", Flag = true)]里的参数 - 可能原因:只看了
TargetNode或TargetSymbol,没继续看Attributes - 解决方案:从
GeneratorAttributeSyntaxContext.Attributes进入,每一项都是AttributeData,继续看ConstructorArguments和NamedArguments - 相关章节:第 6 章、第 12 章
- 相关术语:GeneratorAttributeSyntaxContext、AttributeData、ConstructorArguments、NamedArguments
下一步去哪里
- 已经找到目标,但生成代码有问题:看 FAQ 分册 3:生成代码错误
- 返回 FAQ 首页:看 常见问题与排错