示例#1
0
        /// <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));
        }
示例#2
0
        /// <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);
        }