Beispiel #1
0
                /// <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);
                }
Beispiel #2
0
        /// <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);
        }