Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));

		}