Ejemplo n.º 1
0
        public static Type GetClosedParameterType(this AbstractTypeEmitter type, Type parameter)
        {
            if (parameter.IsGenericTypeDefinition)
            {
                return(parameter.GetGenericTypeDefinition().MakeGenericType(type.GetGenericArgumentsFor(parameter)));
            }

            if (parameter.IsGenericType)
            {
                var arguments = parameter.GetGenericArguments();
                if (CloseGenericParametersIfAny(type, arguments))
                {
                    return(parameter.GetGenericTypeDefinition().MakeGenericType(arguments));
                }
            }

            if (parameter.IsGenericParameter)
            {
                return(type.GetGenericArgument(parameter.Name));
            }

            if (parameter.IsArray)
            {
                var elementType = GetClosedParameterType(type, parameter.GetElementType());
                return(elementType.MakeArrayType());
            }

            if (parameter.IsByRef)
            {
                var elementType = GetClosedParameterType(type, parameter.GetElementType());
                return(elementType.MakeByRefType());
            }

            return(parameter);
        }