Ejemplo n.º 1
0
        public void EmitCall(OpCode opcode, MethodInfo methodInfo, Type[] optionalParameterTypes)
        {
            ArgumentUtility.CheckNotNull("methodInfo", methodInfo);
            // Optional parameters may be null

            var constructorAsMethod = methodInfo as ConstructorAsMethodInfoAdapter;

            if (constructorAsMethod != null)
            {
                if (optionalParameterTypes != null && optionalParameterTypes.Any())
                {
                    throw new ArgumentException("Constructor calls cannot have optional parameters.", "optionalParameterTypes");
                }

                Emit(opcode, constructorAsMethod.AdaptedConstructor);
                return;
            }

            var baseCallMethod = methodInfo as NonVirtualCallMethodInfoAdapter;

            if (baseCallMethod != null)
            {
                EmitCall(AdjustOpCodeForBaseCall(opcode), baseCallMethod.AdaptedMethod, optionalParameterTypes);
                return;
            }

            var emittableOperand = _emittableOperandProvider.GetEmittableMethod(methodInfo);

            _innerILGenerator.EmitCall(opcode, emittableOperand, optionalParameterTypes);
        }