// // 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); }
// // 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; }