Skip to content

泛型类型

本文档介绍如何在 Roslyn 中处理泛型类型,包括泛型定义、类型参数和约束。


📋 文档信息

属性
难度高级
阅读时间30 分钟
前置知识C# 泛型、基本类型
相关文档基本类型类型系统索引

泛型类型检测

检查是否为泛型

csharp
public bool IsGenericType(INamedTypeSymbol type)
{
    return type.IsGenericType;
}

public bool IsUnboundGenericType(INamedTypeSymbol type)
{
    return type.IsUnboundGenericType;
}

类型参数

获取类型参数

csharp
public ImmutableArray<ITypeSymbol> GetTypeArguments(INamedTypeSymbol type)
{
    return type.TypeArguments;
}

public ImmutableArray<ITypeParameterSymbol> GetTypeParameters(INamedTypeSymbol type)
{
    return type.TypeParameters;
}

泛型约束

检查约束

csharp
public void AnalyzeConstraints(ITypeParameterSymbol typeParam)
{
    // 检查是否有引用类型约束
    if (typeParam.HasReferenceTypeConstraint)
    {
        Console.WriteLine("有引用类型约束");
    }
    
    // 检查是否有值类型约束
    if (typeParam.HasValueTypeConstraint)
    {
        Console.WriteLine("有值类型约束");
    }
    
    // 检查是否有构造函数约束
    if (typeParam.HasConstructorConstraint)
    {
        Console.WriteLine("有构造函数约束");
    }
    
    // 获取类型约束
    foreach (var constraint in typeParam.ConstraintTypes)
    {
        Console.WriteLine($"约束类型: {constraint.ToDisplayString()}");
    }
}

构造泛型类型

创建泛型实例

csharp
public INamedTypeSymbol ConstructGenericType(
    INamedTypeSymbol genericType,
    params ITypeSymbol[] typeArguments)
{
    return genericType.Construct(typeArguments);
}

关键要点

  • ✅ 使用 IsGenericType 检查是否为泛型
  • ✅ 使用 TypeArguments 获取类型参数
  • ✅ 使用 TypeParameters 获取类型参数定义
  • ✅ 使用 Construct 方法构造泛型类型实例

相关文档


最后更新: 2026-02-06

基于 MIT 许可发布