泛型类型
本文档介绍如何在 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