C#反射將DataTable轉換為實體,將DataRow轉換為物件實體
阿新 • • 發佈:2018-12-18
//將DataTable轉為物件實體:T為資料型別 public static List<T> DataTableToObjects<T>(DataTable dt) { List<T> objList = new List<T>(); if (dt != null && dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { T obj = DataRowToObject<T>(dr); objList.Add(obj); } } return objList; }
//將DataRow轉換為物件實體:T為資料型別 public static T DataRowToObject<T>(DataRow dr) { T obj = Activator.CreateInstance<T>(); //先建立一個實體例項 //獲取實體例項的屬性資訊 ArrayList propertyInfoList = new ArrayList(); foreach (PropertyInfo propInfo in obj.GetType().GetProperties()) { propertyInfoList.Add(propInfo); } //遍歷各個屬性 for (int i = 0; i <= propertyInfoList.Count - 1; i++) { PropertyInfo propertyInfo = (PropertyInfo)propertyInfoList[i]; if (propertyInfo.CanWrite) { if (dr.Table.Columns.Contains(propertyInfo.Name)) { if (dr[propertyInfo.Name] != DBNull.Value) { try { object dataValue = dr[propertyInfo.Name]; //資料行中的欄位的值 object value = ConvertToPropertyValue(propertyInfo, dataValue); //將欄位的值轉換為屬性值 propertyInfo.SetValue(obj, value, null); } catch { } } } } } return obj; }
//將資料行中的資料值轉換為屬性值 private static object ConvertToPropertyValue(PropertyInfo propInfo, object value) { try { //型別轉換器的呼叫 object[] ormAtts = propInfo.GetCustomAttributes(typeof(ORMAttribute), false); if (ormAtts.Length > 0) { Type cvType = ((ORMAttribute)ormAtts[0]).ConvertProvider; if (cvType != null && cvType == typeof(ITypeConvertProvider)) { object converter = Activator.CreateInstance(cvType); return ((ITypeConvertProvider)converter).Convert(value); } } //列舉型別轉換 if (propInfo.PropertyType.IsEnum) { object returnValue = ORMEnumConverter.GetEnumValue(value.ToString(), propInfo.PropertyType); if (returnValue == null) { returnValue = System.Enum.ToObject(propInfo.PropertyType, value); } return returnValue; } //列舉值泛型轉換 if (propInfo.PropertyType.IsValueType && propInfo.PropertyType.IsGenericType) { if (typeof(Nullable<>) == propInfo.PropertyType.GetGenericTypeDefinition()) { Type genericArg = propInfo.PropertyType.GetGenericArguments()[0]; if (genericArg.IsEnum) { object returnValue = ORMEnumConverter.GetEnumValue(value.ToString(), genericArg); if (returnValue == null) { returnValue = System.Enum.ToObject(genericArg, value); } return returnValue; } return Convert.ChangeType(value, genericArg); } } //對於GUID型別的處理 if (propInfo.PropertyType.FullName == "System.Guid") { if (value is byte[]) { return new Guid((byte[])value); } else if (value is string) { return new Guid((string)value); } } return Convert.ChangeType(value, propInfo.PropertyType); } catch { } return null; }