void BindField(string key, object value, bool enableRecursive, int level)
        {
            if (value == null)
            {
                StringField.Add(key, "");
                return;
            }

            if (value is Image)
            {
                var img = value as Image;
                PostedFile.Add(new RequestImageField(img, ImageFormat.Jpeg, 90, key, @"c:\ifish.jpg"));
                return;
            }

            var type = value.GetType();

            if (type == typeof(string) || type.IsValueType)
            {
                StringField.Add(key, value.ToString());
            }
            else if (type == typeof(byte[]))
            {
                //bytes[] 直接当作文件
                PostedFile.Add(new HttpVirtualBytePostFile(key, "", value as byte[]));
            }
            else if (type.IsSubclassOf(typeof(Stream)))
            {
                var stream = value as Stream;
                if (stream != null)
                {
                    PostedFile.Add(new HttpVirtualStreamPostFile(key, "", stream));
                }
            }
            else if (typeof(HttpPostFile).IsAssignableFrom(type))
            {
                var file = (HttpPostFile)value;
                if (string.IsNullOrEmpty(file.FieldName))
                {
                    file.FieldName = key;
                }
                PostedFile.Add(file);
            }
            else
            {
                if (enableRecursive)
                {
                    BindObject(value, key, level + 1);
                }
            }
        }
        /// <summary>
        /// 绑定对象数据
        /// </summary>
        protected void BindObject(Object obj, string prefix = "")
        {
            if (obj is IFormData)
            {
                ((IFormData)obj).GetAllFields().ForEach(s => StringField.Add(s.Key, s.Value));
            }
            else if (obj is System.Collections.Specialized.NameValueCollection)
            {
                var nvc = (System.Collections.Specialized.NameValueCollection)obj;
                nvc.AllKeys.ForEach(s => StringField.Add(s, nvc[s]));
            }
            else if (obj is Dictionary <string, string> )
            {
                var nvc = (Dictionary <string, string>)obj;
                nvc.ForEach(s => StringField.Add(s.Key, s.Value));
            }
            else if (obj is string[][])
            {
                var zigzagArray = (string[][])obj;
                foreach (var item in zigzagArray)
                {
                    StringField.Add(item[0], item[1]);
                }
            }
            else if (obj is string[, ])
            {
                var multiArray = (string[, ])obj;
                for (int i = 0; i <= multiArray.GetUpperBound(0); i++)
                {
                    StringField.Add(multiArray[i, 0], multiArray[i, 1]);
                }
            }
            else
            {
                var props = TypeDescriptor.GetProperties(obj).Cast <PropertyDescriptor>();
                foreach (var pd in props)
                {
                    if (pd.Attributes.OfType <IgnoreFieldAttribute>().Any())
                    {
                        continue;
                    }

                    var fn = pd.Attributes.OfType <FormNameAttribute>().FirstOrDefault();
                    var fp = pd.Attributes.OfType <AttachedFileAttribute>().FirstOrDefault();

                    var key = prefix + (fn == null ? pd.Name : fn.Name);
                    if (fp != null)
                    {
                        if (pd.PropertyType == typeof(string))
                        {
                            var path = (pd.GetValue(obj) ?? "").ToString();
                            if (path.IsNullOrEmpty())
                            {
                                continue;
                            }

                            PostedFile.Add(new HttpPostFile(key, path));
                        }
                        else
                        {
                            throw new InvalidOperationException("附加上传文件的属性属性只能是字符串");
                        }
                        continue;
                    }
                    var v = pd.GetValue(obj);
                    if (v == null)
                    {
                        continue;
                    }

                    //序列化
                    var satt = pd.Attributes.OfType <ObjectSerializeAttribute>().FirstOrDefault();
                    if (satt != null)
                    {
                        switch (satt.SerializeType)
                        {
                        case ObjectSerializationType.Xml:
                            StringField.Add(key, v.XmlSerializeToString());
                            break;

                        case ObjectSerializationType.Json:
                            StringField.Add(key, Newtonsoft.Json.JsonConvert.SerializeObject(v));
                            break;
                        }
                        continue;
                    }

                    if (pd.PropertyType == typeof(string) || pd.PropertyType.IsValueType)
                    {
                        StringField.Add(key, v.ToString());
                    }
                    else
                    {
                        BindObject(v, key + ".");
                    }
                }
            }
        }
        /// <summary>
        /// 绑定对象数据
        /// </summary>
        protected virtual void BindObject(object obj, string prefix = "", int level = 0)
        {
            if (obj is IFormData)
            {
                var formdata = obj as IFormData;

                var fields = formdata.GetAllFields();
                fields.ForEach(s => StringField.Add(KeyGenerator.Generate(prefix, s.Key), s.Value));
                var files = formdata.GetAllFiles();
                files.ForEach(s =>
                {
                    s.FieldName = KeyGenerator.Generate(prefix, s.FieldName);
                    PostedFile.Add(s);
                });

                formdata.BindData(Client, Context, Message, this, prefix, level);
            }
            else if (obj is System.Collections.Specialized.NameValueCollection)
            {
                var nvc = (System.Collections.Specialized.NameValueCollection)obj;
                nvc.AllKeys.ForEach(s => StringField.Add(KeyGenerator.Generate(prefix, s), nvc[s]));
            }
            else if (obj is IDictionary <string, string> )
            {
                var nvc = (IDictionary <string, string>)obj;
                nvc.ForEach(s => StringField.Add(KeyGenerator.Generate(prefix, s.Key), s.Value));
            }
            else if (obj is IDictionary <string, object> )
            {
                var nvc = (IDictionary <string, object>)obj;
                nvc.ForEach(s => BindField(KeyGenerator.Generate(prefix, s.Key), s.Value, level < KeyGenerator.MaximumDeepth, level));
            }
            else if (obj is string[][])
            {
                var zigzagArray = (string[][])obj;
                foreach (var item in zigzagArray)
                {
                    StringField.Add(KeyGenerator.Generate(prefix, item[0]), item[1] ?? "");
                }
            }
            else if (obj is string[])
            {
                var array = (string[])obj;
                for (int i = 0; i < array.Length; i++)
                {
                    StringField.Add(KeyGenerator.Generate(prefix, i), array[i] ?? "");
                }
            }
            else if (obj is string[, ])
            {
                var multiArray = (string[, ])obj;
                for (int i = 0; i <= multiArray.GetUpperBound(0); i++)
                {
                    StringField.Add(KeyGenerator.Generate(prefix, multiArray[i, 0]), multiArray[i, 1]);
                }
            }
            else
            {
                var props = TypeDescriptor.GetProperties(obj).Cast <PropertyDescriptor>();
                foreach (var pd in props)
                {
                    if (pd.Attributes.OfType <IgnoreFieldAttribute>().Any())
                    {
                        continue;
                    }

                    var fn = pd.Attributes.OfType <FormNameAttribute>().FirstOrDefault();
                    var fp = pd.Attributes.OfType <AttachedFileAttribute>().FirstOrDefault();

                    var key = KeyGenerator.Generate(prefix, (fn == null ? pd.Name : fn.Name));
                    if (fp != null)
                    {
                        if (pd.PropertyType == typeof(string))
                        {
                            var path = (pd.GetValue(obj) ?? "").ToString();
                            if (path.IsNullOrEmpty())
                            {
                                continue;
                            }

                            PostedFile.Add(new HttpPostFile(key, path));
                        }
                        else
                        {
                            throw new InvalidOperationException("附加上传文件的属性属性只能是字符串");
                        }
                        continue;
                    }

                    var v = pd.GetValue(obj);

                    //序列化
                    var satt = pd.Attributes.OfType <ObjectSerializeAttribute>().FirstOrDefault();
                    if (satt != null)
                    {
                        switch (satt.SerializeType)
                        {
                        case ObjectSerializationType.Xml:
                            StringField.Add(key, v.XmlSerializeToString());
                            break;

                        case ObjectSerializationType.Json:
                            StringField.Add(key, Context.JsonSerialize(v));
                            break;
                        }
                        continue;
                    }

                    BindField(key, v, level < KeyGenerator.MaximumDeepth, level);
                }
            }
        }