/// <summary> /// </summary> /// <param name="typeSymbol"> /// </param> /// <param name="genericContext"> /// </param> /// <returns> /// </returns> internal static IType ResolveGeneric(this TypeSymbol typeSymbol, IGenericContext genericContext, bool isByRef = false, bool isPinned = false) { if (genericContext != null && !genericContext.IsEmpty) { if (typeSymbol.IsTypeParameter()) { return(genericContext.ResolveTypeParameter(new MetadataTypeAdapter(typeSymbol, isByRef, isPinned), isByRef, isPinned)); } var arrayType = typeSymbol as ArrayTypeSymbol; if (arrayType != null) { return(arrayType.ElementType.ResolveGeneric(genericContext, isByRef, isPinned).ToArrayType(arrayType.Rank)); } var namedTypeSymbol = typeSymbol as NamedTypeSymbol; if (namedTypeSymbol != null) { var metadataType = new MetadataTypeAdapter(namedTypeSymbol, isByRef, isPinned); if (metadataType.IsGenericTypeDefinition && !genericContext.IsEmpty) { return(new MetadataTypeAdapter(namedTypeSymbol, genericContext, isByRef, isPinned)); } } } return(new MetadataTypeAdapter(typeSymbol, genericContext, isByRef, isPinned)); }
/// <summary> /// </summary> /// <param name="typeSymbol"> /// </param> /// <param name="genericContext"> /// </param> /// <returns> /// </returns> internal static IType ResolveGeneric(this TypeSymbol typeSymbol, IGenericContext genericContext, bool isByRef = false, bool isPinned = false) { if (genericContext != null && !genericContext.IsEmpty) { if (typeSymbol.IsTypeParameter()) { return genericContext.ResolveTypeParameter(new MetadataTypeAdapter(typeSymbol, isByRef, isPinned), isByRef, isPinned); } var arrayType = typeSymbol as ArrayTypeSymbol; if (arrayType != null) { return arrayType.ElementType.ResolveGeneric(genericContext, isByRef, isPinned).ToArrayType(arrayType.Rank); } var namedTypeSymbol = typeSymbol as NamedTypeSymbol; if (namedTypeSymbol != null) { var metadataType = new MetadataTypeAdapter(namedTypeSymbol, isByRef, isPinned); if (metadataType.IsGenericTypeDefinition && !genericContext.IsEmpty) { return new MetadataTypeAdapter(namedTypeSymbol, genericContext, isByRef, isPinned); } } } return new MetadataTypeAdapter(typeSymbol, genericContext, isByRef, isPinned); }