Appearance
术语分册 4:特性与泛型
这一册负责解释“特性参数怎么读、泛型约束怎么恢复、嵌套类型怎么回拼”。
AttributeData
关键成员:
| 成员 | 能拿到什么 |
|---|---|
AttributeClass | 这个特性本身的类型 |
ConstructorArguments | 特性位置参数 |
NamedArguments | 特性命名参数 |
ApplicationSyntaxReference | 这个特性在源码里的位置 |
AttributeClass
- 一句话说明:
AttributeData对应的特性类型 - 什么时候会用到:你要确认命中的到底是哪一个特性
ConstructorArguments
- 一句话说明:读取特性位置参数
- 什么时候会用到:例如
[MyAttr("x", 123)]
你能拿到什么:
| 你想知道什么 | 看什么 |
|---|---|
| 第一个位置参数值 | ConstructorArguments[0].Value |
| 参数类型 | ConstructorArguments[i].Type |
NamedArguments
- 一句话说明:读取特性命名参数
- 什么时候会用到:例如
[MyAttr(Flag = true)]
你能拿到什么:
| 你想知道什么 | 看什么 |
|---|---|
| 某个参数名是否存在 | 遍历 NamedArguments |
| 某个参数值 | kv.Value.Value |
ITypeParameterSymbol
关键成员:
| 成员 | 能拿到什么 |
|---|---|
Name | 泛型参数名 |
HasReferenceTypeConstraint | 是否有 class 约束 |
HasValueTypeConstraint | 是否有 struct 约束 |
HasNotNullConstraint | 是否有 notnull 约束 |
HasConstructorConstraint | 是否有 new() 约束 |
ConstraintTypes | 其他基类或接口约束 |
TypeParameters
- 一句话说明:类型定义上的泛型参数集合
- 什么时候会用到:你要从
INamedTypeSymbol取回所有泛型参数
ContainingType
- 一句话说明:当前类型的外层类型
- 什么时候会用到:你要恢复嵌套类的外层结构
- 对应教程:第 10 章
典型用途:
csharp
for (var current = symbol.ContainingType; current is not null; current = current.ContainingType)
{
// 逐层恢复外层类型
}最常见的恢复动作
| 你想恢复什么 | 常见对象 |
|---|---|
[Attr("x", Flag = true)] 的参数 | AttributeData |
where T : class, new() | ITypeParameterSymbol |
Outer.Inner<T> 里的 Outer | ContainingType |
这一册最容易漏掉的点
- 主案例没有特性参数,不代表生成器拿不到特性参数
TypeParameters只给你参数本身,约束还要看每个ITypeParameterSymbol- 嵌套类如果只记类名不记
ContainingType,生成代码很容易错位
下一步去哪里
- 想看测试里如何构造编译和驱动:看 术语分册 5:编译与测试
- 想看运行结果和步骤跟踪:看 术语分册 6:驱动与跟踪
- 返回索引:看 术语与 API 手册