示例#1
0
        public static void LoadPrivateProperty(this ILGenerator il, Action thisInStack, PropertyInfo info)
        {
            //加载GetValue的第一个参数 即PropertyInfo
            il.REmit(OpCodes.Ldtoken, info.DeclaringType);
            il.REmit(OpCodes.Call, ClassCache.ClassHandle);
            il.REmit(OpCodes.Ldstr, info.Name);
            il.REmit(OpCodes.Ldc_I4_S, 60);
            il.REmit(OpCodes.Callvirt, ClassCache.PropertyInfoGetter);

            //加载GetValue的第二个参数
            if (thisInStack != null)
            {
                thisInStack();
            }
            ;
            il.Packet(info.DeclaringType);

            //调用GetValue
            il.REmit(OpCodes.Callvirt, ClassCache.PropertyValueGetter);
            il.UnPacket(info.PropertyType);

            if (info.PropertyType.IsValueType && !info.PropertyType.IsPrimitive)
            {
                LocalBuilder builder = il.DeclareLocal(info.PropertyType);
                il.EmitStoreBuilder(builder);
                il.LoadBuilder(builder);
            }

            il.BoolInStack(info.PropertyType);
            //il.CallNullableValue(info.PropertyType,true);
        }
示例#2
0
        //加载私有字段
        public static void LoadPrivateFieldValue(this ILGenerator il, Action thisInStack, FieldInfo info)
        {
            //加载GetValue的第一个参数 即FieldInfo
            il.REmit(OpCodes.Ldtoken, info.DeclaringType);
            il.REmit(OpCodes.Call, ClassCache.ClassHandle);
            il.REmit(OpCodes.Ldstr, info.Name);
            il.REmit(OpCodes.Ldc_I4_S, 44);
            il.REmit(OpCodes.Callvirt, ClassCache.FieldInfoGetter);

            //加载GetValue的第二个参数
            if (thisInStack != null)
            {
                thisInStack();
            }
            il.Packet(info.DeclaringType);

            //调用GetValue
            il.REmit(OpCodes.Callvirt, ClassCache.FieldValueGetter);

            //拆箱
            il.UnPacket(info.FieldType);
            il.BoolInStack(info.FieldType);
        }