private static FastGetValueHandler GetValueInvoker(FieldInfo field) { //定义一个没有名字的动态方法 DynamicMethod dynamicMethod = new DynamicMethod(String.Empty, typeof(Object), new Type[] { typeof(Object) }, field.DeclaringType.Module, true); ILGenerator il = dynamicMethod.GetILGenerator(); EmitHelper help = new EmitHelper(il); // 必须考虑对象是值类型的情况,需要拆箱 // 其它地方看到的程序从来都没有人处理 help.Ldarg(0) .CastFromObject(field.DeclaringType) .Ldfld(field) .BoxIfValueType(field.FieldType) .Ret(); //il.Emit(OpCodes.Ldarg_0); ////il.Emit(OpCodes.Isinst, field.DeclaringType); ////il.Emit(OpCodes.Castclass, field.DeclaringType); //il.Emit(OpCodes.Ldfld, field); //if (field.FieldType.IsValueType) il.Emit(OpCodes.Box, field.FieldType); //il.Emit(OpCodes.Ret); //if (field.Name == "key") //{ // SaveIL(dynamicMethod, delegate(ILGenerator il2) // { // il2.Emit(OpCodes.Ldarg_0); // il2.Emit(OpCodes.Ldfld, field); // if (field.FieldType.IsValueType) il2.Emit(OpCodes.Box, field.FieldType); // il2.Emit(OpCodes.Ret); // }); //} return((FastGetValueHandler)dynamicMethod.CreateDelegate(typeof(FastGetValueHandler))); }
private static FastSetValueHandler SetValueInvoker(MethodInfo method) { //定义一个没有名字的动态方法 DynamicMethod dynamicMethod = new DynamicMethod(String.Empty, null, new Type[] { typeof(Object), typeof(Object) }, method.DeclaringType.Module, true); ILGenerator il = dynamicMethod.GetILGenerator(); EmitHelper help = new EmitHelper(il); //if (!method.IsStatic) il.Emit(OpCodes.Ldarg_0); if (!method.IsStatic) { help.Ldarg(0).CastFromObject(method.DeclaringType); } // 目标方法只有一个参数 help.Ldarg(1) .CastFromObject(method.GetParameters()[0].ParameterType) .Call(method) .Ret(); return((FastSetValueHandler)dynamicMethod.CreateDelegate(typeof(FastSetValueHandler))); }
private static FastSetValueHandler SetValueInvoker(FieldInfo field) { //定义一个没有名字的动态方法 DynamicMethod dynamicMethod = new DynamicMethod(String.Empty, null, new Type[] { typeof(Object), typeof(Object) }, field.DeclaringType.Module, true); ILGenerator il = dynamicMethod.GetILGenerator(); EmitHelper help = new EmitHelper(il); // 必须考虑对象是值类型的情况,需要拆箱 // 其它地方看到的程序从来都没有人处理 // 值类型是不支持这样子赋值的,暂时没有找到更好的替代方法 help.Ldarg(0) .CastFromObject(field.DeclaringType) .Ldarg(1); //il.Emit(OpCodes.Ldarg_0); //help.CastFromObject(field.DeclaringType); //il.Emit(OpCodes.Ldarg_1); MethodInfo method = GetMethod(field.FieldType); if (method != null) { //// 使用Convert.ToInt32(value) //il.EmitCall(OpCodes.Call, method, null); help.Call(method); } else { //if (field.FieldType.IsValueType) // il.Emit(OpCodes.Unbox_Any, field.FieldType); //else // il.Emit(OpCodes.Castclass, field.FieldType); help.CastFromObject(field.FieldType); } il.Emit(OpCodes.Stfld, field); il.Emit(OpCodes.Ret); return((FastSetValueHandler)dynamicMethod.CreateDelegate(typeof(FastSetValueHandler))); }
static void GetMethodInvoker(ILGenerator il, MethodInfo method) { EmitHelper help = new EmitHelper(il); Type retType = method.ReturnType; //if (!method.IsStatic) il.Emit(OpCodes.Ldarg_0); if (!method.IsStatic) { help.Ldarg(0).CastFromObject(method.DeclaringType); } // 方法的参数数组放在动态方法的第二位,所以是1 help.PushParams(1, method) .Call(method) .BoxIfValueType(retType); //处理返回值,如果调用的方法没有返回值,则需要返回一个空 if (retType == null || retType == typeof(void)) { help.Ldnull().Ret(); } else { help.Ret(); } //调用目标方法 //if (method.IsVirtual) // il.EmitCall(OpCodes.Callvirt, method, null); //else // il.EmitCall(OpCodes.Call, method, null); ////处理返回值 //if (method.ReturnType == typeof(void)) // il.Emit(OpCodes.Ldnull); //else if (method.ReturnType.IsValueType) // il.Emit(OpCodes.Box, method.ReturnType); //il.Emit(OpCodes.Ret); }