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