コード例 #1
0
        private SetFieldValueDelegate CreateSetFieldValueMethod(FieldInfo field)
        {
            DynamicMethod method =
                ILUtil.CreateDynamicMethod(m_reflectedType, null, new Type[] { typeof(object), typeof(object) });

            ILGenerator il = method.GetILGenerator();

            LocalBuilder thisLocal = il.DeclareLocal(m_refinedType);

            il.Emit(OpCodes.Ldarg_0);
            ILUtil.EmitCastToReference(il, m_reflectedType);
            il.Emit(OpCodes.Stloc, thisLocal.LocalIndex);

            Type valueType = field.FieldType;

            // load 'this'
            il.Emit(OpCodes.Ldloc, thisLocal);

            il.Emit(OpCodes.Ldarg_1);

            ILUtil.PrepareFieldForSet(il, valueType);

            il.Emit(OpCodes.Stfld, field);

            il.Emit(OpCodes.Ret);

            return((SetFieldValueDelegate)method.CreateDelegate(typeof(SetFieldValueDelegate)));
        }
コード例 #2
0
        private SetFieldValuesDelegate CreateSetFieldValuesMethod(FieldInfo[] fields)
        {
            Type[]        methodArguments = new Type[] { typeof(object), typeof(object[]) };
            DynamicMethod method          = ILUtil.CreateDynamicMethod(m_reflectedType, null, methodArguments);

            ILGenerator il = method.GetILGenerator();

            LocalBuilder thisLocal = il.DeclareLocal(m_refinedType);

            il.Emit(OpCodes.Ldarg_0);
            ILUtil.EmitCastToReference(il, m_reflectedType);
            il.Emit(OpCodes.Stloc, thisLocal.LocalIndex);

            for (int i = 0; i < fields.Length; i++)
            {
                Type valueType = fields[i].FieldType;

                // load 'this'
                il.Emit(OpCodes.Ldloc, thisLocal);

                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Ldc_I4, i);
                il.Emit(OpCodes.Ldelem_Ref);

                ILUtil.PrepareFieldForSet(il, valueType);

                il.Emit(OpCodes.Stfld, fields[i]);
            }

            il.Emit(OpCodes.Ret);

            return((SetFieldValuesDelegate)method.CreateDelegate(typeof(SetFieldValuesDelegate)));
        }