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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:15:39