Пример #1
0
        /// <summary>
        /// 创建PropertyInfo的动态方法get
        /// </summary>
        /// <param name="propertyInfo"></param>
        /// <returns></returns>
        private static DynamicPropertyGetHandler CreateGetHandler(PropertyInfo propertyInfo)
        {
            MethodInfo getMethodInfo = propertyInfo.GetGetMethod(true);
            int        argIndex      = 0;

            DynamicMethod dynamicGet   = new DynamicMethod("GP", Type_Object, PropertyGet_P, propertyInfo.DeclaringType, true);
            ILGenerator   getGenerator = dynamicGet.GetILGenerator();

            getGenerator.Emit(OpCodes.Ldarg_0);
            foreach (ParameterInfo parainfo in getMethodInfo.GetParameters())
            {
                getGenerator.Emit(OpCodes.Ldarg_1);
                if (argIndex > 8)
                {
                    getGenerator.Emit(OpCodesFactory.GetLdc_I4(argIndex), argIndex);
                }
                else
                {
                    getGenerator.Emit(OpCodesFactory.GetLdc_I4(argIndex));
                }
                getGenerator.Emit(OpCodes.Ldelem_Ref);
                OpCodesFactory.UnboxIfNeeded(getGenerator, parainfo.ParameterType);
                argIndex++;
            }
            getGenerator.Emit(OpCodes.Callvirt, getMethodInfo);
            OpCodesFactory.BoxIfNeeded(getGenerator, getMethodInfo.ReturnType);
            getGenerator.Emit(OpCodes.Ret);

            return((DynamicPropertyGetHandler)dynamicGet.CreateDelegate(Type_DPGH));
        }
Пример #2
0
        /// <summary>
        /// 创建构造函数
        /// </summary>
        /// <param name="constructorInfo"></param>
        /// <returns></returns>
        private static DynamicConstructorInfoHandler CreateDynamicConstructorInfoHandler(ConstructorInfo constructorInfo)
        {
            int argIndex = 0;

            DynamicMethod dynamicMethod = new DynamicMethod("D",
                                                            MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, Type_Object, FieldGet_P, constructorInfo.DeclaringType, true);
            ILGenerator generator = dynamicMethod.GetILGenerator();

            foreach (ParameterInfo parainfo in constructorInfo.GetParameters())
            {
                generator.Emit(OpCodes.Ldarg_0);
                if (argIndex > 8)
                {
                    generator.Emit(OpCodesFactory.GetLdc_I4(argIndex), argIndex);
                }
                else
                {
                    generator.Emit(OpCodesFactory.GetLdc_I4(argIndex));
                }
                generator.Emit(OpCodes.Ldelem_Ref);
                OpCodesFactory.UnboxIfNeeded(generator, parainfo.ParameterType);
                argIndex++;
            }
            generator.Emit(OpCodes.Newobj, constructorInfo);
            generator.Emit(OpCodes.Ret);
            return((DynamicConstructorInfoHandler)dynamicMethod.CreateDelegate(Type_DCIH));
        }
Пример #3
0
        /// <summary>
        /// 创建Field的动态方法get
        /// </summary>
        /// <param name="fieldInfo"></param>
        /// <returns></returns>
        private static DynamicFieldGetHandler CreateGetHandler(FieldInfo fieldInfo)
        {
            DynamicMethod dynamicGet   = new DynamicMethod("GF", Type_Object, FieldGet_P, fieldInfo.DeclaringType, true);
            ILGenerator   getGenerator = dynamicGet.GetILGenerator();

            getGenerator.Emit(OpCodes.Ldarg_0);
            getGenerator.Emit(OpCodes.Ldfld, fieldInfo);
            OpCodesFactory.BoxIfNeeded(getGenerator, fieldInfo.FieldType);
            getGenerator.Emit(OpCodes.Ret);

            return((DynamicFieldGetHandler)dynamicGet.CreateDelegate(Type_DFGH));
        }
Пример #4
0
        /// <summary>
        /// 创建Field的动态方法set
        /// </summary>
        /// <param name="fieldInfo"></param>
        /// <returns></returns>
        private static DynamicFieldSetHandler CreateSetHandler(FieldInfo fieldInfo)
        {
            DynamicMethod dynamicSet   = new DynamicMethod("SF", Type_Void, FieldSet_P, fieldInfo.DeclaringType, true);
            ILGenerator   setGenerator = dynamicSet.GetILGenerator();

            setGenerator.Emit(OpCodes.Ldarg_0);
            setGenerator.Emit(OpCodes.Ldarg_1);
            OpCodesFactory.UnboxIfNeeded(setGenerator, fieldInfo.FieldType);
            setGenerator.Emit(OpCodes.Stfld, fieldInfo);
            setGenerator.Emit(OpCodes.Ret);



            return((DynamicFieldSetHandler)dynamicSet.CreateDelegate(Type_DFSH));
        }
Пример #5
0
        /// <summary>
        /// 创建PropertyInfo的动态方法set
        /// </summary>
        /// <param name="propertyInfo"></param>
        /// <returns></returns>
        private static DynamicPropertySetHandler CreateSetHandler(PropertyInfo propertyInfo)
        {
            MethodInfo setMethodInfo = propertyInfo.GetSetMethod(true);
            int        argCount      = setMethodInfo.GetParameters().Length;
            int        argIndex      = 0;

            DynamicMethod dynamicSet   = new DynamicMethod("SP", Type_Void, PropertySet_P, propertyInfo.DeclaringType, true);
            ILGenerator   setGenerator = dynamicSet.GetILGenerator();

            setGenerator.Emit(OpCodes.Ldarg_0);
            foreach (ParameterInfo parainfo in setMethodInfo.GetParameters())
            {
                if (argIndex + 1 >= argCount)
                {
                    break;
                }

                setGenerator.Emit(OpCodes.Ldarg_2);
                if (argIndex > 8)
                {
                    setGenerator.Emit(OpCodesFactory.GetLdc_I4(argIndex), argIndex);
                }
                else
                {
                    setGenerator.Emit(OpCodesFactory.GetLdc_I4(argIndex));
                }
                setGenerator.Emit(OpCodes.Ldelem_Ref);
                OpCodesFactory.UnboxIfNeeded(setGenerator, parainfo.ParameterType);
                argIndex++;
            }
            setGenerator.Emit(OpCodes.Ldarg_1);
            OpCodesFactory.UnboxIfNeeded(setGenerator, setMethodInfo.GetParameters()[argIndex].ParameterType);
            setGenerator.Emit(OpCodes.Call, setMethodInfo);
            setGenerator.Emit(OpCodes.Ret);

            return((DynamicPropertySetHandler)dynamicSet.CreateDelegate(Type_DPSH));
        }
Пример #6
0
        private static DynamicMethodHandler CreatMethodDelegate(MethodInfo genericMethodInfo, Type[] genericParameterTypes)
        {
            MethodInfo makeGenericMethodInfo;

            if (genericParameterTypes != null && genericParameterTypes.Length > 0)
            {
                makeGenericMethodInfo = genericMethodInfo.MakeGenericMethod(genericParameterTypes);
            }
            else
            {
                makeGenericMethodInfo = genericMethodInfo;
            }

            DynamicMethod dynamicMethod = new DynamicMethod("DM", Type_Object, PropertyGet_P, makeGenericMethodInfo.DeclaringType.Module);
            ILGenerator   il            = dynamicMethod.GetILGenerator();

            ParameterInfo[] ps         = makeGenericMethodInfo.GetParameters();
            Type[]          paramTypes = new Type[ps.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;
                }
            }
            LocalBuilder[] locals = new LocalBuilder[paramTypes.Length];

            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);
                OpCodesFactory.EmitFastInt(il, i);
                il.Emit(OpCodes.Ldelem_Ref);
                OpCodesFactory.EmitCastToReference(il, paramTypes[i]);
                il.Emit(OpCodes.Stloc, locals[i]);
            }
            if (!makeGenericMethodInfo.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 (makeGenericMethodInfo.IsStatic)
            {
                il.EmitCall(OpCodes.Call, makeGenericMethodInfo, null);
            }
            else
            {
                il.EmitCall(OpCodes.Callvirt, makeGenericMethodInfo, null);
            }
            if (makeGenericMethodInfo.ReturnType == typeof(void))
            {
                il.Emit(OpCodes.Ldnull);
            }
            else
            {
                OpCodesFactory.BoxIfNeeded(il, makeGenericMethodInfo.ReturnType);
            }

            for (int i = 0; i < paramTypes.Length; i++)
            {
                if (ps[i].ParameterType.IsByRef)
                {
                    il.Emit(OpCodes.Ldarg_1);
                    OpCodesFactory.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((DynamicMethodHandler)dynamicMethod.CreateDelegate(Type_DM));
        }