使用Microsoft.CodeAnalysis如何获取Type类型Attribute属性的实际类型值
核心原因
对typeof(T)表达式直接调用semanticModel.GetTypeInfo(),获取到的是typeof操作符的返回类型System.Type,不是括号内传入的目标类型T,需要针对typeof对应的语法节点单独解析。
处理方法
- 将特性参数的表达式转换为
TypeOfExpressionSyntax类型,这是Roslyn中typeof(xxx)语法对应的专属节点类型 - 提取该节点的
Type属性,也就是typeof括号内包裹的类型语法节点 - 对这个内部类型节点调用
semanticModel.GetTypeInfo(),即可得到目标类型的ITypeSymbol实例
修正代码
替换原有MigrationFunction分支的逻辑即可:
case nameof(MigrationFunctionAttribute.MigrationFunction): if (attributeArgumentSyntax.Expression is TypeOfExpressionSyntax typeOfExpression) { TypeInfo targetTypeMeta = semanticModel.GetTypeInfo(typeOfExpression.Type); ITypeSymbol actualMigrationType = targetTypeMeta.Type; // 此处actualMigrationType就是你要的MigrationFunctions类型符号 Debug.WriteLine(actualMigrationType.ToDisplayString()); } break;
注意事项
- 该方案适用于所有Roslyn源生成器、分析器中解析特性
Type类型参数的场景 - 建议增加空值判断,避免语法格式异常导致生成器执行崩溃
- 字符串、数值、布尔值这类常量参数,仍然可以沿用原有
GetConstantValue的方式获取,不需要调整
内容的提问来源于stack exchange,提问作者Tim Bassett
相关产品推荐
相关产品推荐

