705 lines
28 KiB
C#
705 lines
28 KiB
C#
using DeviceRepair.Models.Attr;
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Data;
|
||
using System.Globalization;
|
||
using System.Linq;
|
||
using System.Reflection;
|
||
|
||
namespace DeviceRepair.Utils
|
||
{
|
||
/// <summary>
|
||
/// 实体对象<->数据集转换帮助类
|
||
/// </summary>
|
||
public static class DTOHelper<TData> where TData : class, new()
|
||
{
|
||
#region Methods
|
||
|
||
#region 实体对象->DataSet数据集
|
||
private static void AddColumnsByDTOProperty(PropertyInfo pi, ref DataTable dtResult)
|
||
{
|
||
if (dtResult == null)
|
||
{
|
||
dtResult = new DataTable();
|
||
}
|
||
if (dtResult.Columns.Contains(pi.Name))
|
||
{
|
||
return;
|
||
}
|
||
Type colType = pi.PropertyType;
|
||
|
||
#region 查看类型是否需要转换 Myl20190801
|
||
|
||
object[] objBoolConverter = pi.GetCustomAttributes(typeof(BoolConverterAttribute), true);
|
||
if (objBoolConverter != null && objBoolConverter.Length > 0)
|
||
{
|
||
colType = ((BoolConverterAttribute)objBoolConverter[0]).ConvertType;
|
||
}
|
||
|
||
#endregion
|
||
|
||
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
|
||
{
|
||
if (colType.GetGenericArguments()[0].IsEnum)
|
||
{
|
||
//V1.0.1
|
||
colType = typeof(string);
|
||
//V1.0.1
|
||
}
|
||
else
|
||
{
|
||
colType = colType.GetGenericArguments()[0];
|
||
}
|
||
}
|
||
else if (colType.IsEnum)
|
||
{
|
||
colType = typeof(string);
|
||
}
|
||
|
||
dtResult.Columns.Add(new DataColumn(pi.Name, colType));
|
||
}
|
||
|
||
public static DataSet ConvertDTOToDataSet<T>(IList<T> sourceList, params string[] propertyNameArray) where T : class
|
||
{
|
||
if (sourceList == null || sourceList.Count == 0)
|
||
{
|
||
return null;
|
||
}
|
||
|
||
List<string> propertyNameList = new List<string>();
|
||
if (propertyNameArray != null)
|
||
{
|
||
propertyNameList.AddRange(propertyNameArray);
|
||
}
|
||
DataSet dsResult = new DataSet("Datas");
|
||
DataTable dtResult = new DataTable();
|
||
|
||
Type[] typeArr = sourceList.GetType().GetGenericArguments();
|
||
if (typeArr.Length == 0)
|
||
{
|
||
return dsResult;
|
||
}
|
||
|
||
#region 过滤DomIgnore特性的属性 Myl20180206
|
||
|
||
PropertyInfo[] domProperties = typeArr[0].GetProperties();
|
||
IEnumerable<PropertyInfo> domDomNotIngoredPropertyList =
|
||
domProperties.Where<System.Reflection.PropertyInfo>((A) =>
|
||
{
|
||
return A.GetCustomAttributes(typeof(DomFieldIgnoreAttribute), true).Length == 0;
|
||
});
|
||
|
||
#endregion
|
||
|
||
dtResult.TableName = typeArr[0].Name;
|
||
foreach (PropertyInfo pi in domDomNotIngoredPropertyList)
|
||
{
|
||
if (propertyNameList.Count == 0)
|
||
{
|
||
//dtResult.Columns.Add(pi.Name, pi.PropertyType);
|
||
|
||
AddColumnsByDTOProperty(pi, ref dtResult);
|
||
}
|
||
else
|
||
{
|
||
if (propertyNameList.Contains(pi.Name))
|
||
{
|
||
AddColumnsByDTOProperty(pi, ref dtResult);
|
||
}
|
||
}
|
||
}
|
||
for (int i = 0; i < sourceList.Count; i++)
|
||
{
|
||
ArrayList tempList = new ArrayList();
|
||
foreach (PropertyInfo pi in domDomNotIngoredPropertyList)
|
||
{
|
||
#region Bool类型转换 Myl190801
|
||
|
||
object[] objBoolConverter = pi.GetCustomAttributes(typeof(BoolConverterAttribute), true);
|
||
Type boolConvertType = null;
|
||
if (objBoolConverter != null && objBoolConverter.Length > 0)
|
||
{
|
||
boolConvertType = ((BoolConverterAttribute)objBoolConverter[0]).ConvertType;
|
||
}
|
||
|
||
#endregion
|
||
|
||
if (propertyNameList.Count == 0)
|
||
{
|
||
object obj = pi.GetValue(sourceList[i], null);
|
||
//V1.0.1
|
||
if (pi.PropertyType.IsEnum)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = ((int)Enum.Parse(pi.PropertyType, obj.ToString())).ToString();
|
||
}
|
||
}
|
||
//V1.0.1
|
||
#region Bool类型转换 Myl190801
|
||
|
||
if (pi.PropertyType == typeof(bool))
|
||
{
|
||
if (boolConvertType != null)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = Convert.ChangeType(bool.Parse(obj.ToString()) ? ((BoolConverterAttribute)objBoolConverter[0]).BoolString[0] : ((BoolConverterAttribute)objBoolConverter[0]).BoolString[1], boolConvertType);
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
tempList.Add(obj);
|
||
}
|
||
else
|
||
{
|
||
if (propertyNameList.Contains(pi.Name))
|
||
{
|
||
object obj = pi.GetValue(sourceList[i], null);
|
||
|
||
//V1.0.1
|
||
if (pi.PropertyType.IsEnum)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = ((int)Enum.Parse(pi.PropertyType, obj.ToString())).ToString();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//V1.0.3
|
||
|
||
if ((pi.PropertyType.IsGenericType) && (pi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)))
|
||
{
|
||
if (pi.PropertyType.GetGenericArguments()[0].IsEnum)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = ((int)Enum.Parse(pi.PropertyType.GetGenericArguments()[0], obj.ToString())).ToString();
|
||
}
|
||
}
|
||
}
|
||
|
||
//V1.0.3
|
||
}
|
||
//V1.0.1
|
||
#region Bool类型转换 Myl190801
|
||
|
||
if (pi.PropertyType == typeof(bool))
|
||
{
|
||
if (boolConvertType != null)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = Convert.ChangeType(bool.Parse(obj.ToString()) ? ((BoolConverterAttribute)objBoolConverter[0]).BoolString[0] : ((BoolConverterAttribute)objBoolConverter[0]).BoolString[1], boolConvertType);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
tempList.Add(obj);
|
||
}
|
||
}
|
||
}
|
||
object[] array = tempList.ToArray();
|
||
dtResult.LoadDataRow(array, true);
|
||
}
|
||
dsResult.Tables.Add(dtResult);
|
||
return dsResult;
|
||
}
|
||
|
||
public static DataSet ConvertDTOToDataSet(IList<TData> sourceList, params string[] propertyNameArray)
|
||
{
|
||
return ConvertDTOToDataSet<TData>(sourceList, propertyNameArray);
|
||
}
|
||
|
||
public static DataSet ConvertSingleDTOToDataSet(TData sourceData, params string[] propertyNameArray)
|
||
{
|
||
return ConvertDTOToDataSet(new List<TData>() { sourceData }, propertyNameArray);
|
||
}
|
||
#endregion
|
||
|
||
#region DataTable数据集->实体对象集合
|
||
|
||
#region DataTable利用泛型填充实体类
|
||
/// <summary>
|
||
/// DataTable利用泛型填充实体类
|
||
/// </summary>
|
||
/// <typeparam name="U">实体类类型</typeparam>
|
||
/// <param name="dtData">待填充的DataTable</param>
|
||
/// <returns>
|
||
/// 返回填充完的实体类对象集合
|
||
/// </returns>
|
||
public static IList<U> DataTableToList<U>(DataTable dtData) where U : class
|
||
{
|
||
IList<U> listObject = new List<U>();
|
||
U t = default(U);
|
||
PropertyInfo[] propertypes = null;
|
||
string tempColumnName = string.Empty;
|
||
foreach (DataRow eachRow in dtData.Rows)
|
||
{
|
||
t = Activator.CreateInstance<U>();
|
||
propertypes = t.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
|
||
foreach (PropertyInfo eachProperty in propertypes)
|
||
{
|
||
if (!eachProperty.CanWrite)
|
||
{
|
||
//Myl - 20190122
|
||
continue;
|
||
}
|
||
|
||
#region 优化类型转换问题 Myl - 20190122
|
||
tempColumnName = eachProperty.Name;
|
||
if (dtData.Columns.Contains(tempColumnName))
|
||
{
|
||
#region 添加数值字段的小数位数自动截取 Myl - 20190128
|
||
|
||
int? iDigits = null;
|
||
object[] objNumberDigits = eachProperty.GetCustomAttributes(typeof(NumberDigitsAttribute), true);
|
||
if (objNumberDigits != null && objNumberDigits.Length > 0)
|
||
{
|
||
iDigits = ((NumberDigitsAttribute)objNumberDigits[0]).Digits;
|
||
}
|
||
|
||
#endregion
|
||
|
||
object value = Convert.IsDBNull(eachRow[tempColumnName]) ? null : iDigits == null ? eachRow[tempColumnName] : Math.Round(decimal.Parse(eachRow[tempColumnName].ToString()), iDigits.Value);
|
||
if (value != null)
|
||
{
|
||
if (!eachProperty.PropertyType.IsGenericType)
|
||
{
|
||
//非泛型
|
||
|
||
if (eachProperty.PropertyType.IsEnum)
|
||
{
|
||
//赋值枚举 20210304 Myl Add
|
||
eachProperty.SetValue(t, string.IsNullOrEmpty(value.ToString().Trim()) ? null : Enum.Parse(eachProperty.PropertyType, value.ToString().Trim()), null);
|
||
}
|
||
else if (eachProperty.PropertyType == typeof(string))
|
||
{
|
||
eachProperty.SetValue(t, string.IsNullOrEmpty(value.ToString().Trim()) ? null : Convert.ChangeType(value.ToString().Trim(), eachProperty.PropertyType, null), null);
|
||
}
|
||
else
|
||
{
|
||
eachProperty.SetValue(t, string.IsNullOrEmpty(value.ToString().Trim()) ? null : Convert.ChangeType(value, eachProperty.PropertyType, null), null);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//泛型Nullable<>
|
||
Type genericTypeDefinition = eachProperty.PropertyType.GetGenericTypeDefinition();
|
||
if (genericTypeDefinition == typeof(Nullable<>))
|
||
{
|
||
if (eachProperty.PropertyType.GetGenericArguments().Count() > 0 && eachProperty.PropertyType.GetGenericArguments()[0].IsEnum)
|
||
{
|
||
//赋值枚举 20210304 Myl Add
|
||
eachProperty.SetValue(t, string.IsNullOrEmpty(value.ToString().Trim()) ? null : Enum.Parse(eachProperty.PropertyType.GetGenericArguments()[0], value.ToString().Trim()), null);
|
||
}
|
||
else
|
||
{
|
||
eachProperty.SetValue(t, string.IsNullOrEmpty(value.ToString().Trim()) ? null : Convert.ChangeType(value, Nullable.GetUnderlyingType(eachProperty.PropertyType), null), null);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#endregion
|
||
}
|
||
listObject.Add(t);
|
||
}
|
||
return listObject;
|
||
}
|
||
#region DataTable利用泛型填充实体类
|
||
/// <summary>
|
||
/// DataTable利用泛型填充实体类
|
||
/// </summary>
|
||
/// <param name="dtData">待填充的DataTable</param>
|
||
/// <returns></returns>
|
||
public static IList<TData> DataTableToList(DataTable dtData)
|
||
{
|
||
return DataTableToList<TData>(dtData);
|
||
}
|
||
|
||
/// <summary>
|
||
/// DataTable利用泛型填充实体类,并制定特定的筛选条件
|
||
/// Myl 20210310
|
||
/// </summary>
|
||
/// <param name="dtData">待填充的DataTable</param>
|
||
/// <param name="filterString">筛选条件</param>
|
||
/// <returns></returns>
|
||
public static IList<TData> DataTableToList(DataTable dtData, string filterString)
|
||
{
|
||
if (!string.IsNullOrEmpty(filterString))
|
||
{
|
||
DataTable dtFilter = dtData.Clone();
|
||
var vFilterRows = dtData.Select(filterExpression: filterString);
|
||
foreach (var eachFilterRow in vFilterRows)
|
||
{
|
||
DataRow drFilterNewRow = dtFilter.NewRow();
|
||
drFilterNewRow.ItemArray = eachFilterRow.ItemArray;
|
||
dtFilter.Rows.Add(drFilterNewRow);
|
||
}
|
||
return DataTableToList(dtFilter);
|
||
}
|
||
else
|
||
{
|
||
return DataTableToList(dtData);
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#endregion
|
||
|
||
public static TData ToEntity(DataRow adaptedRow)
|
||
{
|
||
if (adaptedRow == null)
|
||
{
|
||
return default(TData);
|
||
}
|
||
TData entity = Activator.CreateInstance<TData>();
|
||
CopyToEntity(entity, adaptedRow);
|
||
return entity;
|
||
}
|
||
|
||
public static object ToEntity(DataRow adaptedRow, Type entityType)
|
||
{
|
||
if (entityType == null || adaptedRow == null)
|
||
{
|
||
return null;
|
||
}
|
||
object entity = Activator.CreateInstance(entityType);
|
||
CopyToEntity(entity, adaptedRow);
|
||
return entity;
|
||
}
|
||
|
||
public static T ToEntity<T>(DataRow adaptedRow, T value) where T : new()
|
||
{
|
||
T item = new T();
|
||
if (value == null || adaptedRow == null)
|
||
{
|
||
return item;
|
||
}
|
||
item = Activator.CreateInstance<T>();
|
||
CopyToEntity(item, adaptedRow);
|
||
|
||
return item;
|
||
}
|
||
|
||
public static TData ToEntity(DataRow adaptedRow, TData value)
|
||
{
|
||
return ToEntity<TData>(adaptedRow, value);
|
||
}
|
||
|
||
public static void CopyToEntity(object entity, DataRow adaptedRow)
|
||
{
|
||
if (entity == null || adaptedRow == null)
|
||
{
|
||
return;
|
||
}
|
||
PropertyInfo[] propertyInfos = entity.GetType().GetProperties();
|
||
|
||
foreach (PropertyInfo propertyInfo in propertyInfos)
|
||
{
|
||
if (!CanSetPropertyValue(propertyInfo, adaptedRow))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
try
|
||
{
|
||
if (adaptedRow[propertyInfo.Name] is DBNull)
|
||
{
|
||
propertyInfo.SetValue(entity, null, null);
|
||
continue;
|
||
}
|
||
SetPropertyValue(entity, adaptedRow, propertyInfo);
|
||
}
|
||
finally
|
||
{
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
private static bool CanSetPropertyValue(PropertyInfo propertyInfo, DataRow adaptedRow)
|
||
{
|
||
if (!propertyInfo.CanWrite)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
if (!adaptedRow.Table.Columns.Contains(propertyInfo.Name))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
private static void SetPropertyValue(object entity, DataRow adaptedRow, PropertyInfo propertyInfo)
|
||
{
|
||
if (propertyInfo.PropertyType == typeof(DateTime?) ||
|
||
propertyInfo.PropertyType == typeof(DateTime))
|
||
{
|
||
DateTime date = DateTime.MaxValue;
|
||
DateTime.TryParse(adaptedRow[propertyInfo.Name].ToString(),
|
||
CultureInfo.CurrentCulture, DateTimeStyles.None, out date);
|
||
|
||
propertyInfo.SetValue(entity, date, null);
|
||
}
|
||
else
|
||
{
|
||
if (!Convert.IsDBNull(adaptedRow[propertyInfo.Name]))
|
||
{
|
||
#region Myl20210514
|
||
|
||
if (!propertyInfo.PropertyType.IsGenericType)
|
||
{
|
||
//非泛型
|
||
|
||
if (propertyInfo.PropertyType.IsEnum)
|
||
{
|
||
//赋值枚举 20210304 Myl Add
|
||
propertyInfo.SetValue(entity, string.IsNullOrEmpty(adaptedRow[propertyInfo.Name].ToString().Trim()) ? null : Enum.Parse(propertyInfo.PropertyType, adaptedRow[propertyInfo.Name].ToString().Trim()), null);
|
||
}
|
||
else if (propertyInfo.PropertyType == typeof(string))
|
||
{
|
||
propertyInfo.SetValue(entity, string.IsNullOrEmpty(adaptedRow[propertyInfo.Name].ToString().Trim()) ? null : Convert.ChangeType(adaptedRow[propertyInfo.Name].ToString().Trim(), propertyInfo.PropertyType, null), null);
|
||
}
|
||
else
|
||
{
|
||
propertyInfo.SetValue(entity, string.IsNullOrEmpty(adaptedRow[propertyInfo.Name].ToString().Trim()) ? null : Convert.ChangeType(adaptedRow[propertyInfo.Name], propertyInfo.PropertyType, null), null);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//泛型Nullable<>
|
||
Type genericTypeDefinition = propertyInfo.PropertyType.GetGenericTypeDefinition();
|
||
if (genericTypeDefinition == typeof(Nullable<>))
|
||
{
|
||
if (propertyInfo.PropertyType.GetGenericArguments().Count() > 0 && propertyInfo.PropertyType.GetGenericArguments()[0].IsEnum)
|
||
{
|
||
//赋值枚举 20210304 Myl Add
|
||
propertyInfo.SetValue(entity, string.IsNullOrEmpty(adaptedRow[propertyInfo.Name].ToString().Trim()) ? null : Enum.Parse(propertyInfo.PropertyType.GetGenericArguments()[0], adaptedRow[propertyInfo.Name].ToString().Trim()), null);
|
||
}
|
||
else
|
||
{
|
||
propertyInfo.SetValue(entity, string.IsNullOrEmpty(adaptedRow[propertyInfo.Name].ToString().Trim()) ? null : Convert.ChangeType(adaptedRow[propertyInfo.Name], Nullable.GetUnderlyingType(propertyInfo.PropertyType), null), null);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region V4.0 实体转换增加字段自动映射及绑定顺序 20230327
|
||
|
||
/// <summary>
|
||
/// DTO按照映射配置特性自动转换为DataSet数据集
|
||
/// </summary>
|
||
/// <typeparam name="T">泛型类型</typeparam>
|
||
/// <param name="sourceList">数据源集合</param>
|
||
/// <returns></returns>
|
||
public static DataSet DTOToDataSetAutoConvertByAttribute<T>(IList<T> sourceList) where T : class
|
||
{
|
||
if (sourceList == null || sourceList.Count == 0)
|
||
{
|
||
return null;
|
||
}
|
||
|
||
|
||
DataSet dsResult = new DataSet("Datas");
|
||
DataTable dtResult = new DataTable();
|
||
|
||
Type[] typeArr = sourceList.GetType().GetGenericArguments();
|
||
|
||
if (typeArr.Length == 0)
|
||
{
|
||
return dsResult;
|
||
}
|
||
|
||
#region 过滤DomIgnore特性的属性 Myl20180206
|
||
|
||
#region 获取需要转换DOM字段的属性 20230327
|
||
|
||
PropertyInfo[] domProperties = typeArr[0].GetProperties();
|
||
IEnumerable<PropertyInfo> domDomNotIngoredPropertyList =
|
||
domProperties.Where<System.Reflection.PropertyInfo>((A) =>
|
||
{
|
||
return A.GetCustomAttributes(typeof(DomFieldMapAttribute), true).Length > 0;
|
||
});
|
||
if (domDomNotIngoredPropertyList == null || domDomNotIngoredPropertyList.Count() == 0)
|
||
{
|
||
throw new Exception("对象申明中未配置需要字段映射的特性!");
|
||
}
|
||
#endregion
|
||
|
||
#endregion
|
||
|
||
dtResult.TableName = typeArr[0].Name;
|
||
|
||
foreach (PropertyInfo pi in domDomNotIngoredPropertyList)
|
||
{
|
||
object[] objFieldMapConverter = pi.GetCustomAttributes(typeof(DomFieldMapAttribute), true);
|
||
if (objFieldMapConverter != null && objFieldMapConverter.Length > 0)
|
||
{
|
||
var vMapAttr = (DomFieldMapAttribute)objFieldMapConverter[0];
|
||
AddColumnsWithColumnNameByDTOProperty(pi, vMapAttr.MappedFieldName, vMapAttr.MappedFieldSequence, ref dtResult);
|
||
}
|
||
}
|
||
|
||
for (int i = 0; i < sourceList.Count; i++)
|
||
{
|
||
ArrayList tempList = new ArrayList();
|
||
foreach (PropertyInfo pi in domDomNotIngoredPropertyList)
|
||
{
|
||
#region Bool类型转换 Myl190801
|
||
|
||
object[] objBoolConverter = pi.GetCustomAttributes(typeof(BoolConverterAttribute), true);
|
||
Type boolConvertType = null;
|
||
if (objBoolConverter != null && objBoolConverter.Length > 0)
|
||
{
|
||
boolConvertType = ((BoolConverterAttribute)objBoolConverter[0]).ConvertType;
|
||
}
|
||
|
||
#endregion
|
||
|
||
object obj = pi.GetValue(sourceList[i], null);
|
||
|
||
//V1.0.1
|
||
if (pi.PropertyType.IsEnum)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = ((int)Enum.Parse(pi.PropertyType, obj.ToString())).ToString();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//V1.0.3
|
||
|
||
if ((pi.PropertyType.IsGenericType) && (pi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)))
|
||
{
|
||
if (pi.PropertyType.GetGenericArguments()[0].IsEnum)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = ((int)Enum.Parse(pi.PropertyType.GetGenericArguments()[0], obj.ToString())).ToString();
|
||
}
|
||
}
|
||
}
|
||
|
||
//V1.0.3
|
||
}
|
||
//V1.0.1
|
||
#region Bool类型转换 Myl190801
|
||
|
||
if (pi.PropertyType == typeof(bool))
|
||
{
|
||
if (boolConvertType != null)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
obj = Convert.ChangeType(bool.Parse(obj.ToString()) ? ((BoolConverterAttribute)objBoolConverter[0]).BoolString[0] : ((BoolConverterAttribute)objBoolConverter[0]).BoolString[1], boolConvertType);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
tempList.Add(obj);
|
||
}
|
||
object[] array = tempList.ToArray();
|
||
dtResult.LoadDataRow(array, true);
|
||
}
|
||
|
||
#region 字段排序
|
||
foreach (PropertyInfo pi in domDomNotIngoredPropertyList)
|
||
{
|
||
object[] objFieldMapConverter = pi.GetCustomAttributes(typeof(DomFieldMapAttribute), true);
|
||
if (objFieldMapConverter != null && objFieldMapConverter.Length > 0)
|
||
{
|
||
var vMapAttr = (DomFieldMapAttribute)objFieldMapConverter[0];
|
||
dtResult.Columns[vMapAttr.MappedFieldName].SetOrdinal(vMapAttr.MappedFieldSequence);
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
dsResult.Tables.Add(dtResult);
|
||
return dsResult;
|
||
}
|
||
/// <summary>
|
||
/// DTO按照映射配置特性自动转换为DataSet数据集
|
||
/// </summary>
|
||
/// <param name="sourceList">数据源集合</param>
|
||
/// <returns></returns>
|
||
public static DataSet DTOToDataSetAutoConvertByAttribute(IList<TData> sourceList)
|
||
{
|
||
return DTOToDataSetAutoConvertByAttribute<TData>(sourceList);
|
||
}
|
||
public static DataSet AutoConvertSingleDTOToDataSetByAttribute(TData sourceData)
|
||
{
|
||
return DTOToDataSetAutoConvertByAttribute(new List<TData>() { sourceData });
|
||
}
|
||
private static void AddColumnsWithColumnNameByDTOProperty(PropertyInfo pi, string cColumnName, int? iMappedSequence, ref DataTable dtResult)
|
||
{
|
||
if (dtResult == null)
|
||
{
|
||
dtResult = new DataTable();
|
||
}
|
||
if (string.IsNullOrEmpty(cColumnName))
|
||
{
|
||
cColumnName = pi.Name;
|
||
}
|
||
|
||
if (dtResult.Columns.Contains(cColumnName))
|
||
{
|
||
return;
|
||
}
|
||
Type colType = pi.PropertyType;
|
||
|
||
#region 查看类型是否需要转换 Myl20190801
|
||
|
||
object[] objBoolConverter = pi.GetCustomAttributes(typeof(BoolConverterAttribute), true);
|
||
if (objBoolConverter != null && objBoolConverter.Length > 0)
|
||
{
|
||
colType = ((BoolConverterAttribute)objBoolConverter[0]).ConvertType;
|
||
}
|
||
|
||
#endregion
|
||
|
||
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>)))
|
||
{
|
||
if (colType.GetGenericArguments()[0].IsEnum)
|
||
{
|
||
colType = typeof(string);
|
||
}
|
||
else
|
||
{
|
||
colType = colType.GetGenericArguments()[0];
|
||
}
|
||
}
|
||
else if (colType.IsEnum)
|
||
{
|
||
colType = typeof(string);
|
||
}
|
||
|
||
dtResult.Columns.Add(new DataColumn(cColumnName, colType));
|
||
|
||
|
||
}
|
||
|
||
#endregion
|
||
|
||
#endregion
|
||
}
|
||
}
|