/// <summary>
        /// 添加字段
        /// </summary>
        /// <param name="field">字段信息</param>
        public void Push(BinarySerialize.FieldSize field)
        {
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldarg_1);
            generator.Emit(OpCodes.Ldfld, field.Field);
            Type       type   = field.Field.FieldType;
            MethodInfo method = null;

            if (type.IsEnum)
            {
                Type enumType = System.Enum.GetUnderlyingType(type);
                if (enumType == typeof(int))
                {
                    method = unmanagedStreamUnsafeWriteIntMethod;
                }
                else if (enumType == typeof(uint))
                {
                    method = unmanagedStreamUnsafeWriteUIntMethod;
                }
                else if (enumType == typeof(byte))
                {
                    method = unmanagedStreamUnsafeWriteByteMethod;
                }
                else if (enumType == typeof(ulong))
                {
                    method = unmanagedStreamUnsafeWriteULongMethod;
                }
                else if (enumType == typeof(ushort))
                {
                    method = unmanagedStreamUnsafeWriteUShortMethod;
                }
                else if (enumType == typeof(long))
                {
                    method = unmanagedStreamUnsafeWriteLongMethod;
                }
                else if (enumType == typeof(short))
                {
                    method = unmanagedStreamUnsafeWriteShortMethod;
                }
                else if (enumType == typeof(sbyte))
                {
                    method = unmanagedStreamUnsafeWriteSByteMethod;
                }
            }
            else
            {
                method = Serializer.GetSerializeMethod(type);
            }
            generator.call(method);
        }
Пример #2
0
        /// <summary>
        /// 添加字段
        /// </summary>
        /// <param name="field">字段信息</param>
        public void Push(BinarySerialize.FieldSize field)
        {
            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Ldarg_1);
            generator.Emit(OpCodes.Ldfld, field.Field);
            Type       type   = field.Field.FieldType;
            MethodInfo method = null;

            if (type.IsEnum)
            {
                Type enumType = System.Enum.GetUnderlyingType(type);
                if (enumType == typeof(int))
                {
                    method = ((Action <UnmanagedStream, int>)UnmanagedStream.UnsafeWrite).Method;
                }
                else if (enumType == typeof(uint))
                {
                    method = ((Action <UnmanagedStream, uint>)UnmanagedStream.UnsafeWrite).Method;
                }
                else if (enumType == typeof(byte))
                {
                    method = ((Action <UnmanagedStream, byte>)UnmanagedStream.UnsafeWrite).Method;
                }
                else if (enumType == typeof(ulong))
                {
                    method = ((Action <UnmanagedStream, ulong>)UnmanagedStream.UnsafeWrite).Method;
                }
                else if (enumType == typeof(ushort))
                {
                    method = ((Action <UnmanagedStream, ushort>)UnmanagedStream.UnsafeWrite).Method;
                }
                else if (enumType == typeof(long))
                {
                    method = ((Action <UnmanagedStream, long>)UnmanagedStream.UnsafeWrite).Method;
                }
                else if (enumType == typeof(short))
                {
                    method = ((Action <UnmanagedStream, short>)UnmanagedStream.UnsafeWrite).Method;
                }
                else if (enumType == typeof(sbyte))
                {
                    method = ((Action <UnmanagedStream, sbyte>)UnmanagedStream.UnsafeWrite).Method;
                }
            }
            else
            {
                method = Serializer.GetSerializeMethod(type);
            }
            generator.call(method);
        }
Пример #3
0
        /// <summary>
        /// 添加字段
        /// </summary>
        /// <param name="field">字段信息</param>
        public void Push(BinarySerialize.FieldSize field)
        {
            Type type = field.Field.FieldType;

            if (type.IsEnum)
            {
                Type enumType = System.Enum.GetUnderlyingType(type);
                int  size     = sizeof(int);
                if (enumType == typeof(int) || enumType == typeof(uint))
                {
                    size = sizeof(int);
                }
                else if (enumType == typeof(byte) || enumType == typeof(sbyte))
                {
                    size = sizeof(byte);
                }
                else if (enumType == typeof(ulong) || enumType == typeof(long))
                {
                    size = sizeof(long);
                }
                else if (enumType == typeof(ushort) || enumType == typeof(short))
                {
                    size = sizeof(short);
                }

                generator.Emit(OpCodes.Ldarg_1);
                generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(size == sizeof(int) ? OpCodes.Ldind_I4 : (size == sizeof(byte) ? OpCodes.Ldind_I1 : (size == sizeof(long) ? OpCodes.Ldind_I8 : (OpCodes.Ldind_I2))));
                generator.Emit(OpCodes.Stfld, field.Field);

                generator.Emit(OpCodes.Ldarg_0);
                generator.int32(size);
                generator.Emit(OpCodes.Add);
            }
            else
            {
                generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(OpCodes.Ldarg_1);
                generator.Emit(OpCodes.Ldflda, field.Field);
                if (type == typeof(string))
                {
                    generator.Emit(OpCodes.Ldarg_2);
                }
                generator.call(DeSerializer.GetDeSerializeMethod(type));
            }
            generator.Emit(OpCodes.Starg_S, 0);
        }
Пример #4
0
 /// <summary>
 /// 设置字段信息
 /// </summary>
 /// <param name="field"></param>
 public void Set(BinarySerialize.FieldSize field)
 {
     Field           = field.Field;
     SerializeMethod = (Action <UnmanagedStream, object>) typeof(AutoCSer.Reflection.InvokeMethod <,>).MakeGenericType(typeof(UnmanagedStream), Field.FieldType).GetMethod("getTypeObject", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { SimpleSerialize.Serializer.GetSerializeMethod(Field.FieldType) ?? SerializeMethodCache.Get(Field.FieldType) });
 }
Пример #5
0
 /// <summary>
 /// 设置字段信息
 /// </summary>
 /// <param name="field"></param>
 public void Set(BinarySerialize.FieldSize field)
 {
     Field             = field.Field;
     DeSerializeMethod = (Func <DeSerializer, object, object>) typeof(AutoCSer.Reflection.InvokeMethodRef2 <,>).MakeGenericType(typeof(DeSerializer), Field.FieldType).GetMethod("getTypeObjectReturn", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { DeSerializer.GetDeSerializeMethod(Field.FieldType) ?? DeSerializeMethodCache.Get(Field.FieldType) });
 }