private void ReSetValue(ILGenerator il, Type[] paramTypes, LocalBuilder obj_arr) { if (obj_arr == null) { return; } for (int i = 0; i < paramTypes.Length; i++) { var paramType = paramTypes[i]; if (!paramType.IsByRef) //非ref模式的直接跳过 { continue; } il.Emit(OpCodes.Ldloc, obj_arr); //数组对象入栈 il.Emit(OpCodes.Ldc_I4, i); //下标入栈 Type unRefType = TypeHelper.GetUnRefType(paramType); if (unRefType.IsValueType) { il.Emit(OpCodes.Ldarg, i + 1); //对应下标的参数值入栈,注:OpCodes.Ldarg_0 此时代表类对象本身,参数列表的下标从1开始 EmitHelper.Ldind(il, unRefType); il.Emit(OpCodes.Box, unRefType); } else { il.Emit(OpCodes.Ldarg_S, i + 1); il.Emit(OpCodes.Ldind_Ref); } il.Emit(OpCodes.Stelem_Ref); //进行数组的赋值操作 } }
public static LocalBuilder ParameterArray(ILGenerator il, Type[] paramTypes) { var obj_arr = il.DeclareLocal(typeof(object[])); //声明数组的局部变量 il.Emit(OpCodes.Ldc_I4, paramTypes.Length); //数组长度入栈 il.Emit(OpCodes.Newarr, typeof(object)); //初始化数组 il.Emit(OpCodes.Stloc, obj_arr); //对数组的局部变量赋值 //各个参数进数组 for (int i = 0; i < paramTypes.Length; i++) { il.Emit(OpCodes.Ldloc, obj_arr); //数组对象入栈 il.Emit(OpCodes.Ldc_I4, i); //下标入栈 var paramType = paramTypes[i]; //对应下标的参数值入栈,注:OpCodes.Ldarg_0 此时代表类对象本身,参数列表的下标从1开始 if (!paramType.IsByRef) { if (!paramType.IsValueType) { il.Emit(OpCodes.Ldarg, i + 1); } else { il.Emit(OpCodes.Ldarg, i + 1); il.Emit(OpCodes.Box, paramType); } } else { Type unRefType = TypeHelper.GetUnRefType(paramType); if (unRefType.IsValueType) { il.Emit(OpCodes.Ldarg, i + 1); EmitHelper.Ldind(il, unRefType); il.Emit(OpCodes.Box, unRefType); } else { il.Emit(OpCodes.Ldarg_S, i + 1); il.Emit(OpCodes.Ldind_Ref); } } il.Emit(OpCodes.Stelem_Ref); //进行数组的赋值操作 } return(obj_arr); }