コード例 #1
0
ファイル: MemberExtension.cs プロジェクト: wcfylcf/Natasha
        //设置私有字段
        public static void SetPrivateField(this ILGenerator il, Action thisInStack, FieldInfo info, object value)
        {
            //加载SetValue的第一个参数 即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);

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

            //加载SetValue的第三个参数
            il.NoErrorLoad(value, info.FieldType);
            if (value != null)
            {
                if (il.IsNullable(info.FieldType))
                {
                    il.Packet(info.FieldType);
                }
                else
                {
                    il.Packet(value.GetType());
                }
            }
            //调用SetValue
            il.REmit(OpCodes.Callvirt, ClassCache.FieldValueSetter);
        }
コード例 #2
0
ファイル: MemberExtension.cs プロジェクト: wcfylcf/Natasha
        public static void SetPrivateProperty(this ILGenerator il, Action thisInStack, PropertyInfo info, object value)
        {
            //加载SetValue的第一个参数 即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, 44);
            il.REmit(OpCodes.Call, ClassCache.PropertyInfoGetter);

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


            //加载SetValue的第三个参数
            il.NoErrorLoad(value, info.PropertyType);
            if (value != null)
            {
                il.Packet(info.PropertyType);
            }

            //调用SetValue
            il.REmit(OpCodes.Callvirt, ClassCache.PropertyValueSetter);
        }
コード例 #3
0
ファイル: MemberExtension.cs プロジェクト: wcfylcf/Natasha
        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);
        }
コード例 #4
0
ファイル: MemberExtension.cs プロジェクト: wcfylcf/Natasha
        //加载私有字段
        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);
        }