Roslyn - 在另一个 TypeInfo 中获取类型参数的 TypeInfo
Roslyn - Get TypeInfo of type parameter in another TypeInfo
从表示泛型类型的 TypeInfo
对象开始,我想为泛型类型的每个类型参数检索 TypeInfo
s。我想将其公开为具有此签名的扩展方法:
public static TypeInfo[] GetTypeParameterInfos(this TypeInfo genericType) {
//Do stuff
}
如果我传入一个 TypeInfo
表示 List<int>
,它应该 return 一个包含 1 个 TypeInfo
表示 int
的数组。如果我传入一个 TypeInfo
表示 Dictionary<int, string>
,它应该 return 一个带有 int
和 string
TypeInfo
.[=30= 的数组]
这可能吗?怎么样?
Update/Solution:
澄清一下,我问的是 Microsoft.CodeAnalysis.TypeInfo
,而不是 System.Reflection.TypeInfo
。这种名称混淆一直是获得有意义的 Google 结果的真正问题。然而,看起来我真正想要的是 Microsoft.CodeAnalysis.ITypeSymbol
,它可以很容易地从 Roslyn TypeInfo
和 TypeInfo.Type
属性.
获得
解决方案在INamedTypeSymbol.TypeArguments
属性中,其中return是一个ImmutableArray<ITypeSymbol>
对应于给定类型符号的类型参数。
TypeInfo myGenericType = GetTypeInfoSomehow();
ImmutableArray<ITypeSymbol> typeArguments = myGenericType.Type.TypeArguments;
正如您从 source 中看到的那样,Roslyn 的 TypeInfo
是 ITypeSymbol
的一个非常薄的包装器;这就是您需要寻找有关该类型的任何有用信息的地方。
如果该类型实际上是泛型类型(与数组或指针等特殊类型相反),它实际上是一个 INamedTypeSymbol,它具有调查该类型所需的所有 API。
在你的情况下,你只需要 its TypeArguments
property。
从表示泛型类型的 TypeInfo
对象开始,我想为泛型类型的每个类型参数检索 TypeInfo
s。我想将其公开为具有此签名的扩展方法:
public static TypeInfo[] GetTypeParameterInfos(this TypeInfo genericType) {
//Do stuff
}
如果我传入一个 TypeInfo
表示 List<int>
,它应该 return 一个包含 1 个 TypeInfo
表示 int
的数组。如果我传入一个 TypeInfo
表示 Dictionary<int, string>
,它应该 return 一个带有 int
和 string
TypeInfo
.[=30= 的数组]
这可能吗?怎么样?
Update/Solution:
澄清一下,我问的是 Microsoft.CodeAnalysis.TypeInfo
,而不是 System.Reflection.TypeInfo
。这种名称混淆一直是获得有意义的 Google 结果的真正问题。然而,看起来我真正想要的是 Microsoft.CodeAnalysis.ITypeSymbol
,它可以很容易地从 Roslyn TypeInfo
和 TypeInfo.Type
属性.
解决方案在INamedTypeSymbol.TypeArguments
属性中,其中return是一个ImmutableArray<ITypeSymbol>
对应于给定类型符号的类型参数。
TypeInfo myGenericType = GetTypeInfoSomehow();
ImmutableArray<ITypeSymbol> typeArguments = myGenericType.Type.TypeArguments;
正如您从 source 中看到的那样,Roslyn 的 TypeInfo
是 ITypeSymbol
的一个非常薄的包装器;这就是您需要寻找有关该类型的任何有用信息的地方。
如果该类型实际上是泛型类型(与数组或指针等特殊类型相反),它实际上是一个 INamedTypeSymbol,它具有调查该类型所需的所有 API。
在你的情况下,你只需要 its TypeArguments
property。