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