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

源生成器中如何获取带System.Type参数的属性的Type实例?

在源生成器中获取属性Type参数对应的编译时符号

在源生成器的编译阶段,无法直接获取System.Type实例——因为System.Type是运行时类型系统的对象,而生成器运行在编译期,此时目标类型还未被加载到内存中。你需要获取的是编译期的类型符号ITypeSymbol,它包含了该类型在编译时的所有元数据信息,完全能满足生成器的需求。

实现步骤

在你的转换逻辑lambda中,通过属性的构造参数获取对应的ITypeSymbol:

public void Initialize(IncrementalGeneratorInitializationContext context)
{
    context.SyntaxProvider.ForAttributeWithMetadataName("Name.Of.AttributeAttribute", 
        (node, ct) => true, // 替换为你的过滤逻辑
        (context, ct) =>
        {
            // 获取目标属性实例
            var attribute = context.TargetSymbol.GetAttributes()[0];
            // 获取第一个构造参数(假设是Type类型的参数)
            var typeArgument = attribute.ConstructorArguments[0];
            
            // 将参数值转换为ITypeSymbol
            if (typeArgument.Value is ITypeSymbol passedTypeSymbol)
            {
                // 这里可以使用passedTypeSymbol获取类型信息
                var typeName = passedTypeSymbol.Name;
                var typeNamespace = passedTypeSymbol.ContainingNamespace.Name;
                // 执行你的生成逻辑
            }
        });
}

关键说明

  • ITypeSymbol是Roslyn编译API的核心类型,它代表编译期的类型定义,你可以通过它获取类型的名称、命名空间、基类、实现的接口、成员列表等所有编译时可见的元数据。
  • 如果传入的是泛型类型,你可以将ITypeSymbol转换为INamedTypeSymbol,进而访问泛型参数信息。
  • 建议增加类型检查(如示例中的is判断),避免因参数类型不匹配导致的异常。

内容的提问来源于stack exchange,提问作者patvax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:37:23