源生成器中如何获取带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
相关产品推荐
相关产品推荐

