private void CreateGetAllMethod() { if (mGetAllValuesHandler != null) { return; } var dm = new DynamicMethod("_GetAllValues_FH_RT_", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, typeof(object[]), new[] { typeof(object) }, mRecordType, true); var generator = dm.GetILGenerator(); generator.DeclareLocal(typeof(object[])); generator.DeclareLocal(mRecordType); generator.Emit(OpCodes.Ldc_I4, mFieldCount); generator.Emit(OpCodes.Newarr, typeof(object)); generator.Emit(OpCodes.Stloc_0); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Castclass, mRecordType); generator.Emit(OpCodes.Stloc_1); for (var i = 0; i < mFieldCount; i++) { var field = mFields[i]; generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Ldloc_1); generator.Emit(OpCodes.Ldfld, field.mFieldInfo); if (field.mFieldType.IsValueType) { generator.Emit(OpCodes.Box, field.mFieldType); } generator.Emit(OpCodes.Stelem_Ref); //generator.EmitCall(); } // return the value generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ret); mGetAllValuesHandler = (GetAllValuesCallback)dm.CreateDelegate(typeof(GetAllValuesCallback)); }
private void CreateGetAllMethod() { if (mGetAllValuesHandler != null) return; DynamicMethod dm = new DynamicMethod("_GetAllValues_FH_RT_", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, typeof(object[]), new Type[] { typeof(object) }, mRecordType, true); ILGenerator generator = dm.GetILGenerator(); generator.DeclareLocal(typeof(object[])); generator.DeclareLocal(mRecordType); generator.Emit(OpCodes.Ldc_I4, mFieldCount); generator.Emit(OpCodes.Newarr, typeof(object)); generator.Emit(OpCodes.Stloc_0); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Castclass, mRecordType); generator.Emit(OpCodes.Stloc_1); for (int i = 0; i < mFieldCount; i++) { FieldBase field = mFields[i]; generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Ldloc_1); generator.Emit(OpCodes.Ldfld, field.mFieldInfo); if (field.mFieldType.IsValueType) { generator.Emit(OpCodes.Box, field.mFieldType); } generator.Emit(OpCodes.Stelem_Ref); //generator.EmitCall(); } // return the value generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ret); mGetAllValuesHandler = (GetAllValuesCallback)dm.CreateDelegate(typeof(GetAllValuesCallback)); }