Ejemplo n.º 1
0
                /// <summary>
                /// 设置属性信息
                /// </summary>
                /// <param name="property"></param>
                /// <returns></returns>
                public bool Set(PropertyIndex property)
                {
                    GetProperty = property.Member.GetGetMethod(true);
                    bool?isUtf8 = set(property.Member.PropertyType);

                    if (isUtf8 == null)
                    {
                        return((property.GetAttribute <SignMemberAttribute>(false) ?? SignMemberAttribute.Default).IsEncodeUtf8);
                    }
                    return(isUtf8.Value);
                }
Ejemplo n.º 2
0
        /// <summary>
        /// 添加属性
        /// </summary>
        /// <param name="property"></param>
        /// <param name="index"></param>
        /// <returns>是否需要utf-8编码</returns>
        public bool Push(PropertyIndex property, int index)
        {
            Type       type   = property.Member.PropertyType;
            MethodInfo method = property.Member.GetGetMethod(true);

            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.Call, method);
                    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.Call, method);
                    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.Call, method);
                    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.call(method);
                    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.call(method);
                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((property.GetAttribute <SignMemberAttribute>(false) ?? SignMemberAttribute.Default).IsEncodeUtf8);
        }