private DynamicMethodInfo[] CreateDynamicMethods(Type type, string methodName) { MethodInfo[] mis = DynamicHelpers.GetMethods(type, methodName); DynamicMethodInfo[] list = new DynamicMethodInfo[mis.Length]; Type[] types; for (int i = 0; i < mis.Length; i++) { ParameterInfo[] pis = mis[i].GetParameters(); types = new Type[pis.Length]; for (int j = 0; j < pis.Length; j++) { types[j] = pis[j].ParameterType; } list[i] = CreateExcuteMethodProxy(type, mis[i]); } return(list); }
private DynamicMethodInfo CreateExcuteMethodProxy(Type type, MethodInfo mi) { Type objectType = typeof(object); Type[] parameterTypes = { objectType, typeof(object[]) }; DynamicMethod dynamicMethod = new DynamicMethod( string.Concat("M_", TypeToName(type), "_", mi.Name), objectType, parameterTypes); ILGenerator il = dynamicMethod.GetILGenerator(); il.DeclareLocal(type);//0 il.Emit(OpCodes.Ldarg_0); if (IsValueType(type)) { il.Emit(OpCodes.Unbox_Any, type); } else { il.Emit(OpCodes.Castclass, type); } il.Emit(OpCodes.Stloc_0); ParameterInfo[] pis = mi.GetParameters(); int index = pis.Length; for (int i = 0; i < index; i++) { il.DeclareLocal(pis[i].ParameterType); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldelem_Ref); if (IsValueType(pis[i].ParameterType)) { //此处不需要考虑TryParse,因为实参类型必须与形参一致 il.Emit(OpCodes.Unbox_Any, pis[i].ParameterType); } else { if (pis[i].ParameterType.FullName != "System.Object") { il.Emit(OpCodes.Castclass, pis[i].ParameterType); } } il.Emit(OpCodes.Stloc, i + 1); } Ldloc(type, il, 0); for (int i = 0; i < index; i++) { il.Emit(OpCodes.Ldloc, i + 1); } Call(type, il, mi); switch (mi.ReturnType.FullName) { case "System.Void": il.Emit(OpCodes.Ldnull); break; case "System.Object": break; default: if (IsValueType(mi.ReturnType)) { il.Emit(OpCodes.Box, mi.ReturnType); } else { il.Emit(OpCodes.Castclass, objectType); } break; } //il.Emit(OpCodes.Ldnull); il.Emit(OpCodes.Ret); DynamicMethodInfo model = new DynamicMethodInfo(); model.Delegate = dynamicMethod.CreateDelegate(typeof(ExcuteMethodDelegate)) as ExcuteMethodDelegate; model.FullName = string.Concat(TypeToName(type), "_", mi.Name); model.Name = mi.Name; model.Parameters = pis; return(model); }
private DynamicMethodInfo CreateExcuteMethodProxy(Type type, MethodInfo mi) { Type objectType = typeof(Object); Type[] parameterTypes = { objectType, typeof(Object[]) }; DynamicMethod dynamicMethod = new DynamicMethod( String.Concat("DynamicMethod.ExcuteMethod.", type.FullName, ".", mi.Name), objectType, parameterTypes); ILGenerator il = dynamicMethod.GetILGenerator(); il.DeclareLocal(type);//0 il.Emit(OpCodes.Ldarg_0); if (type.IsValueType) { il.Emit(OpCodes.Unbox_Any, type); } else { il.Emit(OpCodes.Castclass, type); } il.Emit(OpCodes.Stloc_0); ParameterInfo[] pis = mi.GetParameters(); Int32 index = pis.Length; for (Int32 i = 0; i < index; i++) { il.DeclareLocal(pis[i].ParameterType); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldelem_Ref); if (pis[i].ParameterType.IsValueType) { //此处不需要考虑TryParse,因为实参类型必须与形参一致 il.Emit(OpCodes.Unbox_Any, pis[i].ParameterType); } else { if (pis[i].ParameterType.FullName != "System.Object") { il.Emit(OpCodes.Castclass, pis[i].ParameterType); } } il.Emit(OpCodes.Stloc, i + 1); } Ldloc(type, il, 0); for (Int32 i = 0; i < index; i++) { il.Emit(OpCodes.Ldloc, i + 1); } Call(type, il, mi); switch (mi.ReturnType.FullName) { case "System.Void": il.Emit(OpCodes.Ldnull); break; case "System.Object": break; default: if (mi.ReturnType.IsValueType) { il.Emit(OpCodes.Box, mi.ReturnType); } else { il.Emit(OpCodes.Castclass, objectType); } break; } //il.Emit(OpCodes.Ldnull); il.Emit(OpCodes.Ret); DynamicMethodInfo model = new DynamicMethodInfo(); model.Delegate = dynamicMethod.CreateDelegate(typeof(ExcuteMethodDelegate)) as ExcuteMethodDelegate; model.FullName = String.Concat(type.FullName, ".", mi.Name); model.Name = mi.Name; model.Parameters = pis; return model; }