public static EmitFastInt ( ILGenerator il, int value ) : void | ||
il | ILGenerator | |
value | int | |
return | void |
private static Func <object[], object> GetConstructorInvoker(ConstructorInfo info) { var dynamicMethod = new DynamicMethod( string.Format("Dynamic{0}{1}{2}", info.DeclaringType.Name.Replace("`1", ""), "Ctor", info.IsGenericMethod ? "G" : ""), typeof(object), new Type[] { typeof(object[]) }, true); var il = dynamicMethod.GetILGenerator(); var ps = info.GetParameters(); var locals = new LocalBuilder[ps.Length]; for (int i = 0; i < ps.Length; i++) { locals[i] = il.DeclareLocal(ps[i].ParameterType, true); } for (int i = 0; i < ps.Length; i++) { il.Emit(OpCodes.Ldarg_0); EmitInvoker.EmitFastInt(il, i); il.Emit(OpCodes.Ldelem_Ref); EmitInvoker.EmitCastToReference(il, ps[i].ParameterType); il.Emit(OpCodes.Stloc, locals[i]); } for (int i = 0; i < ps.Length; i++) { il.Emit(OpCodes.Ldloc, locals[i]); } il.Emit(OpCodes.Newobj, info); il.Emit(OpCodes.Ret); return((Func <object[], object>)dynamicMethod.CreateDelegate(typeof(Func <object[], object>))); }
public static Func <T, K, V> GetInvokerGet(MethodInfo info) { var ps = info.GetParameters(); var method = new DynamicMethod(EmitInvoker.GetMethodName(info), typeof(V), new Type[] { typeof(T), typeof(K) }, true); ILGenerator il = method.GetILGenerator(); if (!info.IsStatic) { il.Emit(OpCodes.Ldarg_0); } if (ps.Length > 0) { il.Emit(OpCodes.Ldarg_1); } for (int i = 1; i < ps.Length; i++) { //if (ps[i].ParameterType.IsByRef) // il.Emit(OpCodes.Ldloca_S, locals[i - 1]); //else // il.Emit(OpCodes.Ldloc, locals[i - 1]); if (ps[i].DefaultValue is Enum) { EmitInvoker.EmitFastInt(il, (int)ps[i].DefaultValue); //EmitCastToReference(il, ps[i].ParameterType); //il.Emit(OpCodes.Castclass, ps[i].ParameterType); } else if (ps[i].DefaultValue is int) { EmitInvoker.EmitFastInt(il, (int)ps[i].DefaultValue); } else if (ps[i].DefaultValue is string) { il.Emit(OpCodes.Ldstr, (string)ps[i].DefaultValue); } else if (ps[i].DefaultValue == null) { il.Emit(OpCodes.Ldnull); } } if (info.IsStatic) { il.EmitCall(OpCodes.Call, info, null); } else { il.EmitCall(OpCodes.Callvirt, info, null); } il.Emit(OpCodes.Ret); return((Func <T, K, V>)method.CreateDelegate(typeof(Func <T, K, V>))); }
public static Func <T, V> GetFieldGetInvoker(FieldInfo info) { var dynamicMethod = new DynamicMethod( string.Format("Dynamic{0}{1}Get", info.DeclaringType.Name, info.Name), typeof(V), new Type[] { typeof(T) }, true); ILGenerator il = dynamicMethod.GetILGenerator(); if (!info.IsStatic) { il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldfld, info); } else { var val = info.GetRawConstantValue(); if (val is int) { EmitInvoker.EmitFastInt(il, (int)val); } else if (val is long) { il.Emit(OpCodes.Ldc_I8, (long)val); } else if (val is float) { il.Emit(OpCodes.Ldc_R4, (float)val); } else { il.Emit(OpCodes.Ldsfld, info); } } //EmitBoxIfNeeded(il, info.FieldType); il.Emit(OpCodes.Ret); return((Func <T, V>)dynamicMethod.CreateDelegate(typeof(Func <T, V>))); }
public static Func <T, object[], V> GetMethodInvoker(MethodInfo info) { var method = new DynamicMethod(EmitInvoker.GetMethodName(info), typeof(V), new Type[] { typeof(T), typeof(object[]) }, true); var il = method.GetILGenerator(); var ps = info.GetParameters(); var paramTypes = new Type[ps.Length]; var locals = new LocalBuilder[paramTypes.Length]; for (int i = 0; i < paramTypes.Length; i++) { if (ps[i].ParameterType.IsByRef) { paramTypes[i] = ps[i].ParameterType.GetElementType(); } else { paramTypes[i] = ps[i].ParameterType; } } for (int i = 0; i < paramTypes.Length; i++) { locals[i] = il.DeclareLocal(paramTypes[i], true); } for (int i = 0; i < paramTypes.Length; i++) { il.Emit(OpCodes.Ldarg_1); EmitInvoker.EmitFastInt(il, i); il.Emit(OpCodes.Ldelem_Ref); EmitInvoker.EmitCastToReference(il, paramTypes[i]); il.Emit(OpCodes.Stloc, locals[i]); } if (!info.IsStatic) { il.Emit(OpCodes.Ldarg_0); } for (int i = 0; i < paramTypes.Length; i++) { if (ps[i].ParameterType.IsByRef) { il.Emit(OpCodes.Ldloca_S, locals[i]); } else { il.Emit(OpCodes.Ldloc, locals[i]); } } if (info.IsStatic) { il.EmitCall(OpCodes.Call, info, null); } else { il.EmitCall(OpCodes.Callvirt, info, null); } if (info.ReturnType == typeof(void)) { il.Emit(OpCodes.Ldnull); } for (int i = 0; i < paramTypes.Length; i++) { if (ps[i].ParameterType.IsByRef) { il.Emit(OpCodes.Ldarg_1); EmitInvoker.EmitFastInt(il, i); il.Emit(OpCodes.Ldloc, locals[i]); if (locals[i].LocalType.IsValueType) { il.Emit(OpCodes.Box, locals[i].LocalType); } il.Emit(OpCodes.Stelem_Ref); } } il.Emit(OpCodes.Ret); return((Func <T, object[], V>)method.CreateDelegate(typeof(Func <T, object[], V>))); }