using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
namespace WMS.Util
{
///
/// Table转换实体处理
///
public class FuncTable2Entity
{
///
/// DataTable转换成对象的List集合
///
/// 对象类型
/// DataTable
///
public static List DataTableToList(DataTable _tab,out string errorMsg) where T : new()
{
errorMsg = string.Empty;
List _list = new List();
if (_tab == null) return _list;
System.Reflection.PropertyInfo[] _infos = typeof(T).GetProperties();
foreach (DataRow _row in _tab.Rows)
{
T _t = new T();
foreach (System.Reflection.PropertyInfo property in _infos)
if (property.CanWrite && _tab.Columns.Contains(property.Name))
{
DataRowToEntity(property, _row, _t, out string msg);
if (!string.IsNullOrWhiteSpace(msg))
{
errorMsg =$"第{_tab.Rows.IndexOf(_row)+1} 行发生错误:{msg}";
return null;
}
}
_list.Add(_t);
}
return _list;
}
public static List DataTableToList(DataTable _tab) where T : new()
{
List _list = new List();
if (_tab == null) return _list;
System.Reflection.PropertyInfo[] _infos = typeof(T).GetProperties();
foreach (DataRow _row in _tab.Rows)
{
T _t = new T();
foreach (System.Reflection.PropertyInfo property in _infos)
if (property.CanWrite && _tab.Columns.Contains(property.Name))
DataRowToEntity(property, _row, _t, out string msg);
_list.Add(_t);
}
return _list;
}
///
/// DataTable转换成对象的List集合
///
///
///
///
///
public static List DataTableToList(DataTable _tab)
where Parent : new()
where Child : new()
{
List _list = new List();
if (_tab == null) return _list;
foreach (DataRow _row in _tab.Rows)
_list.Add(DataRowToEntity(_row));
return _list;
}
///
/// DataTable转换成对象的List集合
///
///
///
///
///
///
public static List DataTableToList(DataTable _tab)
where Parent : new()
where ChildParent : new()
where Child : new()
{
List _list = new List();
if (_tab == null) return _list;
System.Reflection.PropertyInfo[] _infos = typeof(Parent).GetProperties();
foreach (DataRow _row in _tab.Rows)
{
Parent _t = new Parent();
foreach (System.Reflection.PropertyInfo property in _infos)
if (property.CanWrite && property.PropertyType.Name == typeof(ChildParent).Name)
property.SetValue(_t, DataRowToEntity(_row), null);
else if (property.CanWrite && _tab.Columns.Contains(property.Name))
DataRowToEntity(property, _row, _t, out string msg);
_list.Add(_t);
}
return _list;
}
///
/// DataTable转换成对象的List集合
///
///
///
///
///
///
public static List DataTableToList2Child(DataTable _tab)
where Parent : new()
where Child1 : new()
where Child2 : new()
{
List _list = new List();
if (_tab == null) return _list;
System.Reflection.PropertyInfo[] _infos = typeof(Parent).GetProperties();
foreach (DataRow _row in _tab.Rows)
{
Parent _t = new Parent();
foreach (System.Reflection.PropertyInfo property in _infos)
if (property.CanWrite && property.PropertyType.Name == typeof(Child1).Name)
property.SetValue(_t, DataRowToEntity(_row), null);
else if (property.CanWrite && property.PropertyType.Name == typeof(Child2).Name)
property.SetValue(_t, DataRowToEntity(_row), null);
else if (property.CanWrite && _row.Table.Columns.Contains(property.Name))
DataRowToEntity(property, _row, _t, out string msg);
_list.Add(_t);
}
return _list;
}
///
/// 把DataRow转换成实体
///
///
///
///
public static T DataRowToEntity(DataRow _row) where T : new()
{
T _t = new T();
foreach (System.Reflection.PropertyInfo property in typeof(T).GetProperties())
if (property.CanWrite && _row.Table.Columns.Contains(property.Name))
DataRowToEntity(property, _row, _t, out string msg);
return _t;
}
///
/// 把DataRow转换成实体
///
///
///
///
///
public static Parent DataRowToEntity(DataRow _row)
where Parent : new()
where Child : new()
{
Parent _t = new Parent();
foreach (System.Reflection.PropertyInfo property in typeof(Parent).GetProperties())
if (property.CanWrite && property.PropertyType.Name == typeof(Child).Name)
property.SetValue(_t, DataRowToEntity(_row), null);
else if (property.CanWrite && _row.Table.Columns.Contains(property.Name))
DataRowToEntity(property, _row, _t ,out string msg);
return _t;
}
///
/// 把DataRow转换成实体
///
///
///
///
///
///
public static T DataRowToEntity(System.Reflection.PropertyInfo property, DataRow _row, T _t,out string errorMsg) where T : new()
{
errorMsg = string.Empty;
if (_row[property.Name] is DBNull) return _t;
try
{
var type = property.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
var nc = new NullableConverter(type);
if (nc.UnderlyingType == _row.Table.Columns[property.Name].DataType)
{
property.SetValue(_t, _row[property.Name], null);
return _t;
}
type = nc.UnderlyingType;
}
else
{
if (type != typeof(string) && type == _row.Table.Columns[property.Name].DataType)
{
property.SetValue(_t, _row[property.Name], null);
return _t;
}
}
if (type == typeof(bool))
property.SetValue(_t, FuncStr.NullToInt(_row[property.Name]) == 1, null);
else if (type.IsEnum)
property.SetValue(_t, Enum.Parse(type, _row[property.Name].ToString()), null);
else if (type.IsValueType)
{
List typelist = new List() { typeof(byte), typeof(short), typeof(int), typeof(long), typeof(float), typeof(double), typeof(decimal) };
var _value = new object();
if (typelist.Any(t => t == type))
{
var va = new object[] { _row[property.Name].ToString(), System.Globalization.NumberStyles.Float, null, null };
var result = type.InvokeMember("TryParse", System.Reflection.BindingFlags.InvokeMethod, null, null, va);
if ((bool)result == true)
{
_value = va[3];
}
else
{
throw new Exception();
}
}
else
{
_value = type.InvokeMember("Parse", System.Reflection.BindingFlags.InvokeMethod, null, null, new object[] { _row[property.Name].ToString() });
}
property.SetValue(_t, _value, null);
}
else if (type == typeof(string))
property.SetValue(_t, _row[property.Name].ToString().Trim(), null);
else property.SetValue(_t, _row[property.Name], null);
return _t;
}
catch (Exception ex)
{
errorMsg= string.Format("{0}:{1}[{2}] Value is {3}, 值转换错误!", typeof(T).Name, property.Name, property.PropertyType, _row[property.Name]);
return default(T);
}
}
}
}