/// <summary> /// 设置字段信息 /// </summary> /// <param name="field"></param> /// <returns></returns> public bool Set(FieldIndex field) { Field = field.Member; bool?isUtf8 = set(Field.FieldType); if (isUtf8 == null) { return((field.GetAttribute <SignMemberAttribute>(false) ?? SignMemberAttribute.Default).IsEncodeUtf8); } return(isUtf8.Value); }
/// <summary> /// 添加字段 /// </summary> /// <param name="fiedIndex"></param> /// <param name="index"></param> /// <returns>是否需要utf-8编码</returns> public bool Push(FieldIndex fiedIndex, int index) { FieldInfo field = fiedIndex.Member; Type type = field.FieldType; if (type.IsValueType) { MethodInfo numberToStringMethod; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>)) { AutoCSer.Metadata.StructGenericType StructGenericType = AutoCSer.Metadata.StructGenericType.Get(type); Label end = generator.DefineLabel(); if (isValueType) { generator.Emit(OpCodes.Ldarga_S, 0); } else { generator.Emit(OpCodes.Ldarg_0); } generator.Emit(OpCodes.Ldflda, field); generator.Emit(OpCodes.Call, StructGenericType.GetNullableHasValueMethod); generator.Emit(OpCodes.Brfalse_S, end); generator.Emit(OpCodes.Ldarg_1); generator.int32(index); if (isValueType) { generator.Emit(OpCodes.Ldarga_S, 0); } else { generator.Emit(OpCodes.Ldarg_0); } generator.Emit(OpCodes.Ldflda, field); generator.Emit(OpCodes.Call, StructGenericType.GetNullableValueMethod); Type nullableType = type.GetGenericArguments()[0]; if (nullableType.IsEnum) { numberToStringMethod = null; generator.Emit(OpCodes.Box, nullableType); generator.Emit(OpCodes.Callvirt, AutoCSer.Net.WebClient.Emit.Pub.GetToStringMethod(typeof(object))); } else { generator.Emit(OpCodes.Call, (numberToStringMethod = AutoCSer.Net.WebClient.Emit.Pub.GetNumberToStringMethod(nullableType)) ?? AutoCSer.Net.WebClient.Emit.Pub.GetToStringMethod(nullableType)); } generator.Emit(OpCodes.Stelem_Ref); generator.MarkLabel(end); } else { generator.Emit(OpCodes.Ldarg_1); generator.int32(index); if (isValueType) { generator.Emit(OpCodes.Ldarga_S, 0); } else { generator.Emit(OpCodes.Ldarg_0); } generator.Emit(OpCodes.Ldfld, field); if (type.IsEnum) { numberToStringMethod = null; generator.Emit(OpCodes.Box, type); generator.Emit(OpCodes.Callvirt, AutoCSer.Net.WebClient.Emit.Pub.GetToStringMethod(typeof(object))); } else { generator.Emit(OpCodes.Call, (numberToStringMethod = AutoCSer.Net.WebClient.Emit.Pub.GetNumberToStringMethod(type)) ?? AutoCSer.Net.WebClient.Emit.Pub.GetToStringMethod(type)); } generator.Emit(OpCodes.Stelem_Ref); } if (numberToStringMethod != null) { return(false); } } else { Label end = default(Label); if (type != typeof(string)) { if (isValueType) { generator.Emit(OpCodes.Ldarga_S, 0); } else { generator.Emit(OpCodes.Ldarg_0); } generator.Emit(OpCodes.Ldfld, field); generator.Emit(OpCodes.Brfalse_S, end = generator.DefineLabel()); } generator.Emit(OpCodes.Ldarg_1); generator.int32(index); if (isValueType) { generator.Emit(OpCodes.Ldarga_S, 0); } else { generator.Emit(OpCodes.Ldarg_0); } generator.Emit(OpCodes.Ldfld, field); if (type != typeof(string)) { generator.Emit(OpCodes.Callvirt, AutoCSer.Net.WebClient.Emit.Pub.GetToStringMethod(type)); } generator.Emit(OpCodes.Stelem_Ref); if (type != typeof(string)) { generator.MarkLabel(end); } } return((fiedIndex.GetAttribute <SignMemberAttribute>(false) ?? SignMemberAttribute.Default).IsEncodeUtf8); }