/// <summary>
        /// 根据映射方式获取实体或匿名对象的字段以及对应值的 Dictionary 列表
        /// </summary>
        /// <param name="item">实体或匿名实体</param>
        /// <param name="smartMappingType">映射方式</param>
        /// <returns>字段或属性名称,值列表</returns>
        public static Dictionary <string, object> GetColumnDic(object item, FrameMappingType smartMappingType)
        {
            Type itemType = item.GetType();
            Dictionary <string, object> list = new Dictionary <string, object>();

            switch (smartMappingType)
            {
            case FrameMappingType.FrameAttributePublic:         ////公有特性
            case FrameMappingType.FrameAttributePrivate:        ////私有特性
            case FrameMappingType.FrameAttribute:               ////根据特性映射,不区分公有私有
            {
                ////根据特性标识设置属性
                foreach (PropertyInfo propertyInfo in FrameReflection.GetPropertyInfoByAttribute <FrameColumnMappingAttributes>(itemType, smartMappingType))
                {
                    FrameColumnMappingAttributes attribute = Attribute.GetCustomAttribute(propertyInfo, typeof(FrameColumnMappingAttributes), false) as FrameColumnMappingAttributes;
                    object value = propertyInfo.GetValue(item, null);
                    list.Add(attribute.ColumnName, value);
                }
                ////根据特性标识设置字段
                foreach (FieldInfo fieldInfo in FrameReflection.GetFieldInfoByAttribute <FrameColumnMappingAttributes>(itemType, smartMappingType))
                {
                    FrameColumnMappingAttributes attribute = Attribute.GetCustomAttribute(fieldInfo, typeof(FrameColumnMappingAttributes), false) as FrameColumnMappingAttributes;
                    object value = fieldInfo.GetValue(item);
                    list.Add(attribute.ColumnName, value);
                }
            }

            break;

            case FrameMappingType.XmlElementPublic:         ////公有XmlElement
            case FrameMappingType.XmlElementPrivate:        ////私有XmlElement
            case FrameMappingType.XmlElement:               ////根据XmlElement映射,不区分公有私有
            {
                ////根据特性标识设置属性
                foreach (PropertyInfo propertyInfo in FrameReflection.GetPropertyInfoByAttribute <System.Xml.Serialization.XmlElementAttribute>(itemType, smartMappingType))
                {
                    System.Xml.Serialization.XmlElementAttribute attribute = Attribute.GetCustomAttribute(propertyInfo, typeof(System.Xml.Serialization.XmlElementAttribute), false) as System.Xml.Serialization.XmlElementAttribute;
                    object value = propertyInfo.GetValue(item, null);
                    list.Add(attribute.ElementName, value);
                }
                ////根据特性标识设置字段
                foreach (FieldInfo fieldInfo in FrameReflection.GetFieldInfoByAttribute <System.Xml.Serialization.XmlElementAttribute>(itemType, smartMappingType))
                {
                    System.Xml.Serialization.XmlElementAttribute attribute = Attribute.GetCustomAttribute(fieldInfo, typeof(System.Xml.Serialization.XmlElementAttribute), false) as System.Xml.Serialization.XmlElementAttribute;
                    object value = fieldInfo.GetValue(item);
                    list.Add(attribute.ElementName, value);
                }
            }

            break;

            case FrameMappingType.Field:                ////根据字段映射,私有公有均可
            case FrameMappingType.FieldPrivate:         ////根据私有字段映射
            case FrameMappingType.FieldPublic:          ////根据公有字段映射
            {
                foreach (FieldInfo fieldInfo in FrameReflection.GetFieldInfos(itemType, smartMappingType))
                {
                    object value = fieldInfo.GetValue(item);
                    list.Add(fieldInfo.Name, value);
                }
            }

            break;

            case FrameMappingType.Property:                 ////根据属性映射   私有公有均可
            case FrameMappingType.PropertyPublic:           ////根据公有属性映射
            case FrameMappingType.ProertyPrivate:           ////根据私有属性映射
            {
                foreach (PropertyInfo propertyInfo in FrameReflection.GetPropertyInfos(itemType, smartMappingType))
                {
                    object value = propertyInfo.GetValue(item, null);
                    list.Add(propertyInfo.Name, value);
                }
            }

            break;
            }

            return(list);
        }
        /// <summary>
        /// 由一行数据生成一个实体
        /// </summary>
        /// <typeparam name="T">目标实体类型</typeparam>
        /// <param name="dataRow">数据行</param>
        /// <param name="smartMappingType">反射方式</param>
        /// <param name="item">已实例化的实体</param>
        /// <param name="propertyInfos">属性</param>
        /// <param name="fieldInfos">字段</param>
        private static void GetEntity <T>(this DataRow dataRow, FrameMappingType smartMappingType, ref T item, PropertyInfo[] propertyInfos = null, FieldInfo[] fieldInfos = null)
        {
            Type itemType = item.GetType();

            switch (smartMappingType)
            {
            case FrameMappingType.FrameAttributePublic:         ////在公有字段或属性中查找特性
            case FrameMappingType.FrameAttributePrivate:        ////在私有字段或属性中查找特性
            case FrameMappingType.FrameAttribute:               ////在所有字段或属性中查找特性
            {
                ////设置属性的值

                foreach (PropertyInfo propertyInfo in propertyInfos = propertyInfos != null ? propertyInfos : FrameReflection.GetPropertyInfoByAttribute <FrameColumnMappingAttributes>(itemType, smartMappingType))
                {
                    FrameColumnMappingAttributes attribute = Attribute.GetCustomAttribute(propertyInfo, typeof(FrameColumnMappingAttributes), false) as FrameColumnMappingAttributes;
                    if (dataRow.Table.Columns.Contains(attribute.ColumnName))
                    {
                        object value = dataRow[attribute.ColumnName];
                        if (value == null || value.ToString().Trim() == string.Empty)
                        {
                            propertyInfo.SetValue(item, attribute.DefaultVale, null);
                        }
                        else
                        {
                            propertyInfo.SetValue(item, (value.GetType() == propertyInfo.PropertyType ? value : FrameReflection.ConvertTo(value.ToString().Trim(), propertyInfo.PropertyType)), null);
                        }
                    }
                    else
                    {
                        propertyInfo.SetValue(item, attribute.DefaultVale, null);
                    }
                }
                ////设置字段的值
                foreach (FieldInfo fieldInfo in fieldInfos = fieldInfos != null ? fieldInfos : FrameReflection.GetFieldInfoByAttribute <FrameColumnMappingAttributes>(itemType, smartMappingType))
                {
                    FrameColumnMappingAttributes attribute = Attribute.GetCustomAttribute(fieldInfo, typeof(FrameColumnMappingAttributes), false) as FrameColumnMappingAttributes;
                    if (dataRow.Table.Columns.Contains(attribute.ColumnName))
                    {
                        object value = dataRow[attribute.ColumnName];
                        if (value == null || value.ToString().Trim() == string.Empty)
                        {
                            fieldInfo.SetValue(item, attribute.DefaultVale);
                        }
                        else
                        {
                            fieldInfo.SetValue(item, (value.GetType() == fieldInfo.FieldType ? value : FrameReflection.ConvertTo(value.ToString().Trim(), fieldInfo.FieldType)));
                        }
                    }
                    else
                    {
                        fieldInfo.SetValue(item, attribute.DefaultVale);
                    }
                }
            }

            break;

            case FrameMappingType.XmlElement:
            case FrameMappingType.XmlElementPrivate:
            case FrameMappingType.XmlElementPublic:
            {
                ////设置属性的值
                foreach (PropertyInfo propertyInfo in propertyInfos = propertyInfos != null ? propertyInfos : FrameReflection.GetPropertyInfoByAttribute <System.Xml.Serialization.XmlElementAttribute>(itemType, smartMappingType))
                {
                    System.Xml.Serialization.XmlElementAttribute attribute = Attribute.GetCustomAttribute(propertyInfo, typeof(System.Xml.Serialization.XmlElementAttribute), false) as System.Xml.Serialization.XmlElementAttribute;
                    if (dataRow.Table.Columns.Contains(attribute.ElementName))
                    {
                        object value = dataRow[attribute.ElementName];
                        if (value == null || value.ToString().Trim() == string.Empty)
                        {
                            propertyInfo.SetValue(item, null, null);
                        }
                        else
                        {
                            propertyInfo.SetValue(item, (value.GetType() == propertyInfo.PropertyType ? value : FrameReflection.ConvertTo(value.ToString().Trim(), propertyInfo.PropertyType)), null);
                        }
                    }
                    else
                    {
                        propertyInfo.SetValue(item, null, null);
                    }
                }
                ////设置字段的值
                foreach (FieldInfo fieldInfo in fieldInfos = fieldInfos != null ? fieldInfos : FrameReflection.GetFieldInfoByAttribute <System.Xml.Serialization.XmlElementAttribute>(itemType, smartMappingType))
                {
                    System.Xml.Serialization.XmlElementAttribute attribute = Attribute.GetCustomAttribute(fieldInfo, typeof(System.Xml.Serialization.XmlElementAttribute), false) as System.Xml.Serialization.XmlElementAttribute;
                    if (dataRow.Table.Columns.Contains(attribute.ElementName))
                    {
                        object value = dataRow[attribute.ElementName];
                        if (value == null || value.ToString().Trim() == string.Empty)
                        {
                            fieldInfo.SetValue(item, null);
                        }
                        else
                        {
                            fieldInfo.SetValue(item, (value.GetType() == fieldInfo.FieldType ? value : FrameReflection.ConvertTo(value.ToString().Trim(), fieldInfo.FieldType)));
                        }
                    }
                    else
                    {
                        fieldInfo.SetValue(item, null);
                    }
                }
            }

            break;

            case FrameMappingType.Field:        ////按字段映射,不区分公有私有
            case FrameMappingType.FieldPrivate: ////按私有字段映射
            case FrameMappingType.FieldPublic:  ////按公有字段映射
            {
                ////设置字段的值
                foreach (FieldInfo fieldInfo in fieldInfos = fieldInfos != null ? fieldInfos : FrameReflection.GetFieldInfos(itemType, smartMappingType))
                {
                    if (dataRow.Table.Columns.Contains(fieldInfo.Name))
                    {
                        object value = dataRow[fieldInfo.Name];
                        if (value != null && value.ToString().Trim() != string.Empty)
                        {
                            fieldInfo.SetValue(item, (value.GetType() == fieldInfo.FieldType ? value : FrameReflection.ConvertTo(value.ToString(), fieldInfo.FieldType)));
                        }
                    }
                }
            }

            break;

            case FrameMappingType.Property:
            case FrameMappingType.ProertyPrivate:
            case FrameMappingType.PropertyPublic:
            {
                ////设置属性的值
                foreach (PropertyInfo propertyInfo in propertyInfos = propertyInfos != null ? propertyInfos : FrameReflection.GetPropertyInfos(itemType, smartMappingType))
                {
                    if (dataRow.Table.Columns.Contains(propertyInfo.Name))
                    {
                        object value = dataRow[propertyInfo.Name];
                        if (value != null && value.ToString().Trim() != string.Empty)
                        {
                            propertyInfo.SetValue(item, (value.GetType() == propertyInfo.PropertyType ? value : FrameReflection.ConvertTo(value.ToString(), propertyInfo.PropertyType)), null);
                        }
                    }
                }
            }

            break;
            }
        }