Пример #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>
        /// 创建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));
        }