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))); }
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))); }