【问题标题】:Roslyn - Get TypeInfo of type parameter in another TypeInfoRoslyn - 在另一个 TypeInfo 中获取类型参数的 TypeInfo
【发布时间】:2016-12-12 19:33:04
【问题描述】:

从代表泛型类型的TypeInfo 对象开始,我想为泛型类型的每个类型参数检索TypeInfos。我想将此作为具有此签名的扩展方法公开:

public static TypeInfo[] GetTypeParameterInfos(this TypeInfo genericType) {
    //Do stuff
}

如果我传入一个代表 List<int>TypeInfo,它应该返回一个包含 1 个代表 intTypeInfo 的数组。如果我传入代表Dictionary<int, string>TypeInfo,它应该返回一个包含intstring TypeInfo 的数组。

这可能吗?怎么样?


更新/解决方案:

为了澄清,我问的是Microsoft.CodeAnalysis.TypeInfo,而不是System.Reflection.TypeInfo。这种名称混淆一直是获得有意义的谷歌结果的一个真正问题。但是,看起来我真正想要的是Microsoft.CodeAnalysis.ITypeSymbol,它可以很容易地从带有TypeInfo.Type 属性的Roslyn TypeInfo 获得。

解决方案在INamedTypeSymbol.TypeArguments 属性中,它返回与给定类型符号的类型参数对应的ImmutableArray<ITypeSymbol>

TypeInfo myGenericType = GetTypeInfoSomehow();
ImmutableArray<ITypeSymbol> typeArguments = myGenericType.Type.TypeArguments;

【问题讨论】:

  • 您是指 Roslyn ITypeSymbol 还是 Reflection TypeInfo?他们彼此无关。
  • 我指的是 Roslyn 的 Microsoft.CodeAnalysis.TypeInfo,而不是 System.Reflection.TypeInfo。 Roslyn 还有ITypeSymbol 接口,可以从Microsoft.CodeAnalysis.TypeInfo 获取,所以我也可以使用基于ITypeSymbol 的解决方案。
  • 我不断遇到System.Reflection.TypeInfo 的搜索结果。

标签: c# roslyn


【解决方案1】:

source 可以看出,Roslyn 的TypeInfoITypeSymbol 的一个非常薄的包装;这就是您需要寻找有关该类型的任何有用信息的地方。

如果该类型实际上是泛型类型(与数组或指针等特殊类型相反),则它实际上是 INamedTypeSymbol,它具有调查该类型所需的所有 API。

在你的情况下,你只需要its TypeArguments property

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多