/**********************************************************************************/
//  说明: 数据转换工具.
//  注意: 对象列表转换为DataTable或DataTable转换为对象列表.
//        字段参照由对象的PropertyName决定.
//        数据模型类的属性名必需与字段名一致, 包括大小写一致.
/**********************************************************************************/

using System;
using System.Reflection;
using System.Collections;
using System.Data;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Xml;
using System.Web.UI;

namespace vjsdn.converter
{
    public class CDataConvert
    {

        /// <summary>
        /// 根据类创建表结构
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public static DataTable CreateTable(Type t)
        {
            return BuiltTable(t.GetProperties());
        }

        /// <summary>
        /// 根据对象的属性创建数据表
        /// </summary>
        private static DataTable BuiltTable(PropertyInfo[] pinfo)
        {
            try
            {
                if (pinfo == null) return null;
                DataTable table = new DataTable();
                foreach (PropertyInfo info in pinfo)
                {
                    Type type = info.PropertyType;
                    if (info.PropertyType.IsGenericType)
                        type = info.PropertyType.GetGenericArguments()[0];
                    DataColumn column = new DataColumn(info.Name, type);
                    column.AllowDBNull = true;
                    table.Columns.Add(column);
                }
                return table;
            }
            catch { return null; }
        }

        /// <summary>
        /// Object to Object. 将一个对象转换为指定类型的对象.
        /// 注意: destination内的Property必需在source内存在.
        /// </summary>
        public static object CopyProperties(object source, Type destination)
        {
            try
            {
                if (source == null) return null;
                object destObj = destination.Assembly.CreateInstance(destination.FullName);
                PropertyInfo[] propsDest = destObj.GetType().GetProperties();
                foreach (PropertyInfo infoDest in propsDest)
                {
                    object value = GetValueOfObject(source, infoDest.Name);
                    if (CanShallowCopyProperty(value)) SetPropertyValue(destObj, infoDest, value);
                }
                return destObj;
            }
            catch { return null; }
        }

        /// <summary>
        /// 指定参数是否可用于浅拷贝
        /// </summary>
        private static bool CanShallowCopyProperty(object propValue)
        {
            if (propValue == null) return true;
            if (propValue.GetType().IsValueType || propValue is string) return true;
            return false;
        }

        /// <summary>
        /// 复制对象属性.
        /// </summary>
        public static void CopyProperties(object source, object destObj)
        {
            try
            {
                if (source == null || destObj == null) return;
                PropertyInfo[] propsDest = destObj.GetType().GetProperties();
                foreach (PropertyInfo infoDest in propsDest)
                {
                    object value = GetValueOfObject(source, infoDest.Name);
                    if (CanShallowCopyProperty(value)) SetPropertyValue(destObj, infoDest, value);
                }
            }
            catch { }
        }

        /// <summary>
        /// 复制对象. 浅拷贝.
        /// </summary>
        public static object CloneObject(object source)
        {
            try
            {
                if (source == null) return null;
                Type objType = source.GetType();
                object destObj = objType.Assembly.CreateInstance(objType.FullName);
                PropertyInfo[] propsSource = objType.GetProperties();
                foreach (PropertyInfo infoSource in propsSource)
                {
                    object value = GetValueOfObject(source, infoSource.Name);
                    if (CanShallowCopyProperty(value)) SetPropertyValue(destObj, infoSource, value);
                }
                return destObj;
            }
            catch { return null; }
        }

        /// <summary>
        /// 复制一个对象数组.
        /// </summary>
        public static ArrayList CloneObjects(IList source)
        {
            if (source == null) return null;
            ArrayList ret = new ArrayList();
            foreach (object o in source) ret.Add(CloneObject(o));
            return ret;
        }

        /// <summary>
        /// 获取对象指定属性的值
        /// </summary>
        public static object GetValueOfObject(object obj, string property)
        {
            try
            {
                if (obj == null) return null;
                Type type = obj.GetType();
                PropertyInfo[] pinfo = type.GetProperties();
                foreach (PropertyInfo info in pinfo)
                {
                    if (info.Name.ToUpper() == property.ToUpper())
                        return info.GetValue(obj, null);
                }
                return null;
            }
            catch { return null; }
        }

        /// <summary>
        /// 纵对象数据组取出某一个对象. 返回对象指定属性名称(returnPropName)的值
        /// </summary>
        public static object GetObjectValueByKey(IList objects, string keyPropName, object keyValue, string returnPropName)
        {
            object o = GetObjectByKey(objects, keyPropName, keyValue);
            if (o != null)
                return GetValueOfObject(o, returnPropName);
            else
                return null;
        }

        /// <summary>
        /// 纵对象数据组取出某一个对象. 参数指定关键字段名称(keyPropName)及值(keyValue).
        /// </summary>
        public static object GetObjectByKey(IList objects, string keyPropName, object keyValue)
        {
            foreach (object o in objects)
            {
                object value = GetValueOfObject(o, keyPropName);
                if (value == null) continue;
                if (value.ToString().ToLower() == keyValue.ToString().ToLower())
                {
                    return o;
                }
            }
            return null;
        }

        /// <summary>
        /// 查找对象包含指定属性.
        /// </summary>
        public static bool FindProperty(object obj, string property)
        {
            try
            {
                if (obj == null) return false;
                Type type = obj.GetType();
                PropertyInfo[] pinfo = type.GetProperties();
                foreach (PropertyInfo info in pinfo)
                {
                    if (info.Name.ToUpper() == property.ToUpper())
                        return true;
                }
                return false;
            }
            catch { return false; }
        }

        public static void SetValueofDataRow(DataRow dr, string field, object value)
        {
            try
            {
                if (dr == null) return;
                dr[field] = value;

            }
            catch
            {

            }
        }

        /// <summary>
        /// 设置对象某个属性的值
        /// </summary>
        public static void SetValueOfObject(object obj, string property, object value)
        {
            try
            {
                if (obj == null) return;
                Type type = obj.GetType();
                PropertyInfo[] pinfo = type.GetProperties();
                foreach (PropertyInfo info in pinfo)
                {
                    if (info.Name.ToUpper() == property.ToUpper())
                    {
                        SetPropertyValue(obj, info, value);
                        break;
                    }
                }
            }
            catch { }
        }

        public static void SetPropertyValue(object instance, PropertyInfo prop, object value)
        {
            try
            {
                if (prop == null) return;
                if (prop.PropertyType.ToString() == "System.String")
                { }
                else if (prop.PropertyType.ToString() == "System.Decimal")
                    value = Decimal.Parse(value.ToString());
                else if (prop.PropertyType.ToString() == "System.Int32")
                    value = int.Parse(value.ToString());
                else if (prop.PropertyType.ToString() == "System.Single")
                    value = Single.Parse(value.ToString());
                else if (prop.PropertyType.ToString() == "System.DateTime")
                    value = DateTime.Parse(value.ToString());
                prop.SetValue(instance, value, null);
            }
            catch { }
        }

        public static IList CSharpDataTypes()
        {
            ArrayList list = new ArrayList();
            list.Add(typeof(System.DateTime));
            list.Add(typeof(System.Byte));
            list.Add(typeof(System.SByte));
            list.Add(typeof(System.Int16));
            list.Add(typeof(System.Int32));
            list.Add(typeof(System.Int64));
            list.Add(typeof(System.IntPtr));
            list.Add(typeof(System.UInt16));
            list.Add(typeof(System.UInt32));
            list.Add(typeof(System.UInt64));
            list.Add(typeof(System.UIntPtr));
            list.Add(typeof(System.Single));
            list.Add(typeof(System.Double));
            list.Add(typeof(System.Decimal));
            list.Add(typeof(System.Boolean));
            list.Add(typeof(System.Char));
            list.Add(typeof(System.String));
            return list;
        }

        /// <summary>
        /// 根据IList对象创建数据表
        /// </summary>
        public static DataTable IListToDataTable(IList list)
        {
            try
            {
                if (list == null) return null;
                if (list.Count <= 0) return null;
                Type type = list[0].GetType();
                PropertyInfo[] pinfo = type.GetProperties();

                DataTable table = BuiltTable(pinfo);//创建表
                DataRow row = null;
                foreach (object o in list)
                {
                    row = table.NewRow();
                    foreach (PropertyInfo info in pinfo)
                    {
                        object v = info.GetValue(o, null);
                        if (!ColumnExists(table, info.Name)) continue;
                        if (null == v)
                            row[info.Name] = DBNull.Value;
                        else
                            row[info.Name] = v;
                    }
                    table.Rows.Add(row);
                }
                return table;
            }
            catch { return null; }
        }

        public static bool ColumnExists(DataTable dt, string columnName)
        {
            if (dt == null) return false;
            foreach (DataColumn col in dt.Columns)
            {
                if (col.ColumnName.ToLower() == columnName.ToLower())
                    return true;
            }
            return false;
        }

        /// <summary>
        /// 数据表转换为IList对象,Type参数:对象类型
        /// </summary>
        public static IList DataTableToIList(DataTable table, Type type)
        {
            try
            {
                if (table == null) return null;
                IList list = new object[table.Rows.Count];
                object o = null;
                PropertyInfo[] pinfo = type.GetProperties();
                int idx = 0;
                foreach (DataRow row in table.Rows)
                {
                    o = type.Assembly.CreateInstance(type.FullName);
                    foreach (PropertyInfo info in pinfo)
                    {
                        SetPropertyValue(o, info, GetFieldValue(row, info.Name));
                    }
                    list[idx] = o;
                    idx += 1;
                }
                return list;
            }
            catch { return null; }
        }

        /// <summary>
        /// 根据对象的属性取字段的值
        /// </summary>
        private static object GetFieldValue(DataRow row, string propertyName)
        {
            if (row == null) return null;
            if (row.Table.Columns.IndexOf(propertyName) >= 0)
            {
                object value = row[propertyName];
                if (value != null && value is DateTime)
                {
                    if ((DateTime)value <= DateTime.MinValue.AddDays(1))
                        value = null;
                }
                return value;
            }
            return null;
        }

        public static DataRow UpdateDataRowFromObject(DataRow row, object o)
        {
            PropertyInfo[] pinfo = o.GetType().GetProperties();
            foreach (PropertyInfo info in pinfo)
            {
                if (row.Table.Columns.IndexOf(info.Name) >= 0)
                    row[info.Name] = info.GetValue(o, null);
            }
            return row;
        }

        public static DataRow AddDataRowFromObject(DataTable dt, object o)
        {
            DataRow row = dt.NewRow();
            PropertyInfo[] pinfo = o.GetType().GetProperties();
            foreach (PropertyInfo info in pinfo)
            {
                if (dt.Columns.IndexOf(info.Name) >= 0)
                    row[info.Name] = info.GetValue(o, null);
            }
            dt.Rows.Add(row);
            return row;
        }

        public static void SetTwoRowValues(DataRow rowFrom, DataRow rowTo)
        {
            for (int i = 0; i < rowFrom.Table.Columns.Count; i++)
            {
                rowTo[i] = rowFrom[i];
            }
        }

        /// <summary>
        /// 从源行中对相同字段名的列付值
        /// </summary>
        /// <param name="drSouce"></param>
        /// <param name="drTo"></param>
        public static void SetTwoRowSameColValue(DataRow drSource, DataRow drTo)
        {
            for (int i = 0; i < drSource.Table.Columns.Count; i++)
            {
                string fieldname = drSource.Table.Columns[i].ColumnName;
                DataColumn col = drTo.Table.Columns[fieldname];
                if (col != null)
                {
                    drTo[fieldname] = drSource[fieldname];
                }
            }

        }

        /// <summary>
        /// 数据行(DataRow)转换为对象,对象的Type由type参数决定.
        /// </summary>
        public static object DataRowToObject(DataRow row, Type type)
        {
            if (null == row) return null;
            try
            {
                object o = type.Assembly.CreateInstance(type.FullName);
                PropertyInfo[] pinfo = type.GetProperties();
                foreach (PropertyInfo info in pinfo)
                {
                    //字段名称与对象属性相符才赋值
                    if (row.Table.Columns.IndexOf(info.Name) >= 0)
                    {
                        object v = GetFieldValue(row, info.Name);
                        SetPropertyValue(o, info, v);
                    }
                }
                return o;
            }
            catch { return null; }
        }

        /// <summary>
        /// ArrayList转换为对象数组.
        /// </summary>
        public static object[] ToObjects(IList source)
        {
            if (null == source) return null;
            object[] ret = new object[source.Count];
            for (int i = 0; i < source.Count; i++) ret[i] = source[i];
            return ret;
        }

        /// <summary>
        /// 对象数组转换为ArrayList.
        /// </summary>
        public static ArrayList ToArrayList(IList list)
        {
            if (list == null) return null;
            ArrayList arrlist = new ArrayList();
            foreach (object o in list) arrlist.Add(o);
            return arrlist;
        }

        /// <summary>
        /// 对象数组转换为ArrayList.
        /// </summary>
        public static ArrayList ToArrayList(object[] source)
        {
            if (null != source)
                return new ArrayList((ICollection)source);
            else //如果来源数据为null,返回一个空的ArrayList.
                return new ArrayList();
        }

        /// <summary>
        /// 把字符串以逗号分格,转换成数据库格式in('a','b') 
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string ToSQLInDataFormat(string input)
        {
            string HQL = string.Empty;
            if (input == string.Empty)
                return HQL;

            string[] sArray = input.Split(',');
            foreach (string str in sArray)
            {
                if (str.Length == 0) continue;
                HQL += "'" + str + "',";
            }
            if (HQL.Substring(HQL.Length - 1, 1) == ",")
                HQL = HQL.Substring(0, HQL.Length - 1);
            return HQL;

        }

        /// <summary>
        /// 把字符串以逗号分格,转换成数据库格式''a'',''b'' 
        /// </summary>
        public static string ToSQLInDataFormatTwo(string input)
        {
            string HQL = string.Empty;
            if (input == string.Empty)
                return HQL;

            string[] sArray = input.Split(',');
            foreach (string str in sArray)
            {
                if (str.Length == 0) continue;
                HQL += "''" + str + "'',";
            }
            if (HQL.Substring(HQL.Length - 1, 1) == ",")
                HQL = HQL.Substring(0, HQL.Length - 1);
            return HQL;
        }


        public static string ToSQLInDataFormat(string[] input)
        {
            string HQL = string.Empty;
            if (input.Length == 0)
                return HQL;

            foreach (string str in input)
            {
                HQL += "'" + str + "',";
            }
            if (HQL.Substring(HQL.Length - 1, 1) == ",")
                HQL = HQL.Substring(0, HQL.Length - 1);
            return HQL;

        }

        /// <summary>
        /// 从table转成dataset
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static DataSet TableToDataSet(DataTable dt)
        {
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            return ds;
        }


        public static DataSet TableToDataSet(DataTable[] dtArr)
        {
            DataSet ds = new DataSet();
            for (int i = 0; i < dtArr.Length; i++)
            {
                ds.Tables.Add(dtArr[i]);
            }
            return ds;
        }

        /// <summary>
        /// 修改对表的某列的值
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="value"></param>
        public static bool UpdateTableCol(DataTable dt, string fieldName, object value)
        {
            try
            {
                if (dt.Columns.IndexOf(fieldName) < 0)
                    throw new Exception("表没有" + fieldName + "列!");

                foreach (DataRow dr in dt.Rows)
                {
                    dr[fieldName] = value;
                }

                return true;
            }
            catch
            {
                return false;
            }


        }

        /// <summary>
        /// 以逗号分格字符串,返回数组
        /// 如果第一个和最后一个字符为, 去掉
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string[] ToStringSplit(string str)
        {
            if (str.Length > 0)
            {
                if (str[0] == ',')
                    str = str.Substring(1, str.Length - 1);
                if (str[str.Length - 1] == ',')
                    str = str.Substring(0, str.Length - 1);
            }
            string[] sArray = str.Split(',');
            return sArray;
        }


        /// <summary>
        /// 把一个行的数据新增一个表中
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="dr"></param>
        /// <returns></returns>
        public static DataTable AddTableRowByRow(DataTable dt, DataRow dr)
        {

            bool b = false;
            DataRow drNew = dt.NewRow();
            for (int i = 0; i < dr.Table.Columns.Count; i++)
            {
                string colname = dr.Table.Columns[i].ColumnName;
                if (dt.Columns.IndexOf(colname) >= 0)
                {
                    drNew[colname] = dr[colname];
                    b = true;
                }
            }

            if (b)
                dt.Rows.Add(drNew);
            return dt;
        }

    }

    /// <summary>
    /// 对字符或字符串的处理
    /// </summary>
    public class DOString
    {
        /// <summary>
        /// 把字符转成大写并去两边空格
        /// </summary>
        public static string ToTrimAndUpper(string str)
        {
            return str.Trim().ToUpper();
        }

        public static string ToTrimAndUpper(object o)
        {
            return o.ToString().Trim().ToUpper();
        }

        public static string ToTrimAndBigToSmall(object o)
        {
            return BigToSmall(o.ToString().Trim(), 1);
        }

        /// <summary>
        /// 返回一个半角 去左右空格 大写的字符串
        /// </summary>
        public static string ToTUBS(object o)
        {
            return BigToSmall(o.ToString().Trim().ToUpper(), 1);
        }

        /// <summary>
        /// 判断字符是否是数字。是返回true 
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        public static bool NuNumber(char c)
        {
            if ((int)c >= 48 && (int)c <= 57)
                return true;
            else
                return false;

        }

        /// <summary>
        /// 去除千分号
        /// </summary>
        public static object OffkiloSign(object obj)
        {
            if (obj == null)
                return obj;
            string s = obj.ToString();
            return s.Replace(",", string.Empty);
        }


        /// <summary>
        /// 全角半角间转换 direction =-1 (半角转全角)
        /// </summary>

        public static string BigToSmall(string content, int direction)
        {
            string strBig, to_strBig;
            strBig = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '﹃﹄『』$/abcdefghijklmnopqrstuvwxyz.*";
            to_strBig = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '“”“”$/abcdefghijklmnopqrstuvwxyz.*";
            int i;
            for (i = 0; i < strBig.Length; i++)
            {
                if (direction != -1)
                {
                    content = content.Replace(strBig[i], to_strBig[i]);
                }
                else
                {
                    content = content.Replace(to_strBig[i], strBig[i]);
                }
            }
            return content;
        }

        /// <summary>
        /// 对比两个字符串的ASCII值大小,要是X1>X2,将X1,X2交换        
        /// </summary>
        public static void CompareStringASCII(ref string x1, ref string x2)
        {
            if (string.IsNullOrEmpty(x1) || string.IsNullOrEmpty(x2))
                return;
            string y1 = x1.ToUpper();
            string y2 = x2.ToUpper();
            int iLength = y1.Length;
            if (y2.Length < iLength)
                iLength = y2.Length;
            for (int i = 0; i < iLength; i++)
            {
                int iASC1 = (int)y1[i];
                int iASC2 = (int)y2[i];
                if (iASC1 > iASC2)
                {
                    string tmp = x1;
                    x1 = x2;
                    x2 = tmp;
                    break;
                }

                if (iASC1 < iASC2)
                    break;

            }
        }

        /// <summary>
        /// 查找出text中含有spilt字符串从第几个字符结束的位置数组
        /// </summary>
        /// <param name="text">"12345678901234567890"</param>
        /// <param name="spilt">"12"</param>
        /// <returns>2,13</returns>
        public static int[] DoStringIndexArray(string text, string spilt)
        {
            int[] ret = null;
            try
            {
                int iStart = 0;
                int iEnd = text.Length - 1;
                int spiltLength = spilt.Length;
                ArrayList list = new ArrayList();
                while (iStart <= iEnd)
                {
                    int index = text.IndexOf(spilt, iStart);
                    iStart = index + spiltLength;
                    if (iStart <= iEnd)
                    {
                        list.Add(iStart);
                    }
                }
                ret = new int[list.Count];
                for (int i = 0; i < ret.Length; i++)
                {
                    ret[i] = Convert.ToInt32(list[i]);
                }
            }
            catch
            {
                ret = null;
            }
            return ret;
        }


    }

}

 

posted on 2014-03-12 16:13  Keith_  阅读(1565)  评论(0编辑  收藏  举报