using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.Specialized; using System.Reflection; using System.Data; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; using System.Collections; namespace CK.SCP.Utils { public class ConvertHelper { /// /// 转换 DataTable 对象为 IList 对象 /// /// 数据集合 /// 数组对象 public static T[] ToArray(DataTable datas) where T : class, new() { List list = ToList(datas) as List; return list.ToArray(); } /// /// 转换IList对象为DataTable对象 /// /// 数据集合 /// DataTable对象 public static DataTable ToDataTable(IList datas) { return ToDataTable(datas, null); } /// /// 转换IList对象为DataTable对象 /// /// 数据集合 /// DataTable对象 public static DataTable ToDataTable(T[] datas) { return ToDataTable(datas, null); } /// /// 转换IList对象为DataTable对象 /// /// 数据集合 /// 要创建的表名 /// DataTable对象 public static DataTable ToDataTable(IList datas, string tableName) { Type type = typeof(T); if (string.IsNullOrEmpty(tableName)) { tableName = type.Name; } DataTable table = new DataTable(tableName); table.BeginLoadData(); PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo info in properties) { string typeName = info.PropertyType.ToString(); if (info.PropertyType.IsGenericType) { typeName = info.PropertyType.GetGenericArguments()[0].ToString(); } Type type2 = Type.GetType(typeName, false); if (type2 != null) { table.Columns.Add(info.Name, type2); } } if ((datas != null) && (datas.Count > 0)) { foreach (object obj2 in datas) { DataRow row = table.NewRow(); foreach (PropertyInfo info2 in properties) { if (info2.PropertyType.IsGenericType ) { continue; } if ((Type.GetType(info2.PropertyType.ToString(), false) != null) && (info2.GetValue(obj2, null) != null)) { row[info2.Name] = info2.GetValue(obj2, null); } } table.Rows.Add(row); } } table.EndLoadData(); table.AcceptChanges(); return table; } /// /// 转换IList对象为DataTable对象 /// /// 数据集合 /// 要创建的表名 /// DataTable对象 public static DataTable ToDataTable(T[] datas, string tableName) { IList list; if ((datas == null) || (datas.Length == 0)) { list = new List(); } else { list = new List(datas); } return ToDataTable(list, tableName); } /// /// 转换 DataTable 对象为 IList 对象 /// /// 数据集合 /// IList 对象 public static IList ToList(DataTable datas) where T : class, new() { IList list = new List(); if ((datas != null) && (datas.Rows.Count != 0)) { PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (DataRow row in datas.Rows) { T local = Activator.CreateInstance(); foreach (DataColumn column in datas.Columns) { object obj2 = null; if (row.RowState == DataRowState.Deleted) { obj2 = row[column, DataRowVersion.Original]; } else { obj2 = row[column]; } if (obj2 != DBNull.Value) { foreach (PropertyInfo info in properties) { if (column.ColumnName.Equals(info.Name, StringComparison.CurrentCultureIgnoreCase)) { info.SetValue(local, obj2, null); } } } } list.Add(local); } } return list; } /// /// 转换object为 T 值 /// /// T 类型 /// 要被转换的值 /// T 类型值 public static T To(object obj) { return To(obj, default(T)); } /// /// 转换object为 T 值 /// /// T 类型 /// 要被转换的值 /// T 类型值 public static T To(object obj, T defaultValue) { if (obj == null) { return defaultValue; } else if (obj is T) { return (T)obj; } else { try { Type conversionType = typeof(T); object obj2 = null; if (conversionType.Equals(typeof(Guid))) obj2 = new Guid(Convert.ToString(obj)); else obj2 = Convert.ChangeType(obj, conversionType); return (T)obj2; } catch (Exception) { return defaultValue; } } } /// /// 填充客户端提交的值到 T 对象 如appinfo = AppConvert.To(context.Request.Form); /// /// T 类 /// 客户端提交的值 /// T 对象 public static T To(NameValueCollection datas) where T : class, new() { Type type = typeof(T); string[] strArray = type.FullName.Split(new char[] { '.' }); string str = strArray[strArray.Length - 1]; PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); T local = Activator.CreateInstance(); foreach (string str2 in datas.AllKeys) { string str3 = datas[str2]; if (!string.IsNullOrEmpty(str3)) { str3 = str3.TrimEnd(new char[0]); } foreach (PropertyInfo info in properties) { string str4 = string.Format("{0}.{1}", str, info.Name); if (str2.Equals(info.Name, StringComparison.CurrentCultureIgnoreCase) || str2.Equals(str4, StringComparison.CurrentCultureIgnoreCase)) { string typeName = info.PropertyType.ToString(); if (info.PropertyType.IsGenericType) { typeName = info.PropertyType.GetGenericArguments()[0].ToString(); } object nullInternal = GetNullInternal(info.PropertyType); Type conversionType = Type.GetType(typeName, false); if (!string.IsNullOrEmpty(str3)) { nullInternal = Convert.ChangeType(str3, conversionType); } info.SetValue(local, nullInternal, null); } } } return local; } #region 获取类型的默认值 //另一种获取默认值的方法 private static object GetDefaultValue(Type type) { object value = null; if (type.IsValueType) value = Activator.CreateInstance(type); else value = null; return value; } // 获取指定类型的默认值.引用类型(包含String)的默认值为null private static T DefaultValue() { return default(T); } //获取默认值 private static object GetNullInternal(Type type) { if (type.IsValueType) { if (type.IsEnum) { return GetNullInternal(Enum.GetUnderlyingType(type)); } if (type.IsPrimitive) { if (type == typeof(int)) { return 0; } if (type == typeof(double)) { return 0.0; } if (type == typeof(short)) { return (short)0; } if (type == typeof(sbyte)) { return (sbyte)0; } if (type == typeof(long)) { return 0L; } if (type == typeof(byte)) { return (byte)0; } if (type == typeof(ushort)) { return (ushort)0; } if (type == typeof(uint)) { return 0; } if (type == typeof(ulong)) { return (ulong)0L; } if (type == typeof(ulong)) { return (ulong)0L; } if (type == typeof(float)) { return 0f; } if (type == typeof(bool)) { return false; } if (type == typeof(char)) { return '\0'; } } else { if (type == typeof(DateTime)) { return DateTime.MinValue; } if (type == typeof(decimal)) { return 0M; } if (type == typeof(Guid)) { return Guid.Empty; } if (type == typeof(TimeSpan)) { return new TimeSpan(0, 0, 0); } } } return null; } // /// 复制控件。 /// /// /// /// public static T GetObjectClone(T serializeObj) { string base64String = SerializeObject(serializeObj); return DeserializeObject(base64String); } /// /// 序列化为Base64String。 /// /// /// /// public static string SerializeObject(T serializeObj) { string base64String = string.Empty; MemoryStream ms = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); try { formatter.Serialize(ms, serializeObj); base64String = Convert.ToBase64String(ms.GetBuffer()); } catch (SerializationException e) { Console.WriteLine("Failed to serialize. Reason: " + e.Message); throw; } finally { ms.Close(); } return base64String; } /// /// 从Base64反序列化。 /// /// /// /// public static T DeserializeObject(string base64String) { MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64String)); BinaryFormatter formatter = new BinaryFormatter(); try { // Deserialize the hashtable from the file and // assign the reference to the local variable. return (T)formatter.Deserialize(ms); } catch (Exception e) { Console.WriteLine("Failed to deserialize. Reason: " + e.Message); throw; } finally { ms.Close(); } } #endregion } }