private static OpCode GetStindInstruction(System.Type parameterType)
 {
     if (parameterType.IsByRef)
     {
         OpCode stindOpCode;
         if (OpCodesMap.TryGetStindOpCode(parameterType.GetElementType(), out stindOpCode))
         {
             return(stindOpCode);
         }
     }
     return(OpCodes.Stind_Ref);
 }
        public void PushArguments(ParameterInfo[] methodParameters, ILGenerator il, bool isStatic)
        {
            var parameters     = methodParameters ?? new ParameterInfo[0];
            var parameterCount = parameters.Length;

            il.Emit(OpCodes.Ldc_I4, parameterCount);
            il.Emit(OpCodes.Newarr, typeof(object));
            il.Emit(OpCodes.Stloc_S, 0);
            if (parameterCount == 0)
            {
                il.Emit(OpCodes.Ldloc_S, 0);
                return;
            }
            var index            = 0;
            var argumentPosition = 1;

            foreach (var param in parameters)
            {
                var parameterType = param.ParameterType.IsByRef ? param.ParameterType.GetElementType() : param.ParameterType;
                il.Emit(OpCodes.Ldloc_S, 0);
                il.Emit(OpCodes.Ldc_I4, index);
                if (param.IsOut)
                {
                    il.Emit(OpCodes.Ldnull);
                    il.Emit(OpCodes.Stelem_Ref);
                    argumentPosition++;
                    index++;
                    continue;
                }
                il.Emit(OpCodes.Ldarg, argumentPosition);
                if (param.ParameterType.IsByRef)
                {
                    OpCode ldindInstruction;
                    if (!OpCodesMap.TryGetLdindOpCode(param.ParameterType.GetElementType(), out ldindInstruction))
                    {
                        ldindInstruction = OpCodes.Ldind_Ref;
                    }
                    il.Emit(ldindInstruction);
                }
                if (parameterType == null)
                {
                    throw new InvalidOperationException("parameterType cannot be null");
                }
                if (parameterType.IsValueType || param.ParameterType.IsByRef || parameterType.IsGenericParameter)
                {
                    il.Emit(OpCodes.Box, parameterType);
                }
                il.Emit(OpCodes.Stelem_Ref);
                index++;
                argumentPosition++;
            }
            il.Emit(OpCodes.Ldloc_S, 0);
        }