Ejemplo n.º 1
0
        //
        // Returns the ParameterInfo objects for the return parameter (in element 0), and the method parameters (in elements 1..length).
        //
        // The ParameterInfo objects will report "contextMethod" as their Member property and use it to get type variable information from
        // the contextMethod's declaring type. The actual metadata, however, comes from "this."
        //
        // The methodTypeArguments provides the fill-ins for any method type variable elements in the parameter type signatures.
        //
        // Does not array-copy.
        //
        public                                   RuntimeMethodParameterInfo[] GetRuntimeParametersAndReturn(MethodBase contextMethod, RuntimeType[] methodTypeArguments)
        {
            MetadataReader reader      = _reader;
            TypeContext    typeContext = contextMethod.DeclaringType.GetRuntimeTypeInfo <RuntimeTypeInfo>().TypeContext;

            typeContext = new TypeContext(typeContext.GenericTypeArguments, methodTypeArguments);
            ReflectionDomain      reflectionDomain = _definingTypeInfo.ReflectionDomain;
            MethodSignature       methodSignature  = this.MethodSignature;
            LowLevelList <Handle> typeSignatures   = new LowLevelList <Handle>(10);

            typeSignatures.Add(methodSignature.ReturnType.GetReturnTypeSignature(_reader).Type);
            foreach (ParameterTypeSignatureHandle parameterTypeSignatureHandle in methodSignature.Parameters)
            {
                typeSignatures.Add(parameterTypeSignatureHandle.GetParameterTypeSignature(_reader).Type);
            }
            int count = typeSignatures.Count;

            RuntimeMethodParameterInfo[] result = new RuntimeMethodParameterInfo[count];
            foreach (ParameterHandle parameterHandle in _method.Parameters)
            {
                Parameter parameterRecord = parameterHandle.GetParameter(_reader);
                int       index           = parameterRecord.Sequence;
                result[index] =
                    RuntimeFatMethodParameterInfo.GetRuntimeFatMethodParameterInfo(
                        contextMethod,
                        _methodHandle,
                        index - 1,
                        parameterHandle,
                        reflectionDomain,
                        reader,
                        typeSignatures[index],
                        typeContext);
            }
            for (int i = 0; i < count; i++)
            {
                if (result[i] == null)
                {
                    result[i] =
                        RuntimeThinMethodParameterInfo.GetRuntimeThinMethodParameterInfo(
                            contextMethod,
                            i - 1,
                            reflectionDomain,
                            reader,
                            typeSignatures[i],
                            typeContext);
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        //
        // Returns the ParameterInfo objects for the return parameter (in element 0), and the method parameters (in elements 1..length).
        //
        // The ParameterInfo objects will report "contextMethod" as their Member property and use it to get type variable information from
        // the contextMethod's declaring type. The actual metadata, however, comes from "this."
        //
        // The methodTypeArguments provides the fill-ins for any method type variable elements in the parameter type signatures.
        //
        // Does not array-copy.
        //
        public RuntimeMethodParameterInfo[] GetRuntimeParametersAndReturn(MethodBase contextMethod, RuntimeType[] methodTypeArguments)
        {
            MetadataReader reader = _reader;
            TypeContext typeContext = contextMethod.DeclaringType.GetRuntimeTypeInfo<RuntimeTypeInfo>().TypeContext;
            typeContext = new TypeContext(typeContext.GenericTypeArguments, methodTypeArguments);
            ReflectionDomain reflectionDomain = _definingTypeInfo.ReflectionDomain;
            MethodSignature methodSignature = this.MethodSignature;
            LowLevelList<Handle> typeSignatures = new LowLevelList<Handle>(10);
            typeSignatures.Add(methodSignature.ReturnType.GetReturnTypeSignature(_reader).Type);
            foreach (ParameterTypeSignatureHandle parameterTypeSignatureHandle in methodSignature.Parameters)
            {
                typeSignatures.Add(parameterTypeSignatureHandle.GetParameterTypeSignature(_reader).Type);
            }
            int count = typeSignatures.Count;

            RuntimeMethodParameterInfo[] result = new RuntimeMethodParameterInfo[count];
            foreach (ParameterHandle parameterHandle in _method.Parameters)
            {
                Parameter parameterRecord = parameterHandle.GetParameter(_reader);
                int index = parameterRecord.Sequence;
                result[index] =
                    RuntimeFatMethodParameterInfo.GetRuntimeFatMethodParameterInfo(
                        contextMethod,
                        _methodHandle,
                        index - 1,
                        parameterHandle,
                        reflectionDomain,
                        reader,
                        typeSignatures[index],
                        typeContext);
            }
            for (int i = 0; i < count; i++)
            {
                if (result[i] == null)
                {
                    result[i] =
                        RuntimeThinMethodParameterInfo.GetRuntimeThinMethodParameterInfo(
                            contextMethod,
                            i - 1,
                        reflectionDomain,
                        reader,
                        typeSignatures[i],
                        typeContext);
                }
            }
            return result;
        }