• DataTable To Entity


    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Reflection;
    using System.ComponentModel;


    public static class DataTableUtility
    {
    /// <summary>
    /// DataTable To IList<T>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="dt"></param>
    /// <returns></returns>
    public static IList<T> ToList<T>(this DataTable dt)
    {
    if (dt == null || dt.Rows.Count == 0) return null;
    IList<T> list = new List<T>();
    foreach (DataRow row in dt.Rows)
    {
    T obj = row.ToEntity<T>();
    list.Add(obj);
    }
    return list;
    }

    /// <summary>
    /// DataRow To T
    /// </summary>
    public static T ToEntity<T>(this DataRow row)
    {
    Type objType = typeof(T);
    T obj = Activator.CreateInstance<T>();

    foreach (DataColumn column in row.Table.Columns)
    {
    PropertyInfo property =
    objType.GetProperty(column.ColumnName,
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
    if (property == null || !property.CanWrite)
    {
    continue;
    }
    object value = row[column.ColumnName];
    if (value == DBNull.Value) value = null;

    property.SetValue(obj, value, null);

    }
    return obj;
    }


    /// <summary>
    /// List To DataTable
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list"></param>
    /// <returns></returns>
    public static DataTable ToDataTable<T>(this List<T> list)
    {
    try
    {
    Type objType = typeof(T);
    DataTable dataTable = new DataTable(objType.Name);
    if (list != null ? list.Count > 0 : false)
    {
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(objType);
    foreach (PropertyDescriptor property in properties)
    {
    Type propertyType = property.PropertyType;

    //nullables must use underlying types
    if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
    propertyType = Nullable.GetUnderlyingType(propertyType);
    //enums also need special treatment
    if (propertyType.IsEnum)
    propertyType = Enum.GetUnderlyingType(propertyType); //probably Int32

    dataTable.Columns.Add(property.Name, propertyType);
    }

    foreach (T li in list)
    {
    DataRow row = dataTable.NewRow();
    foreach (PropertyDescriptor property1 in properties)
    {
    row[property1.Name] = property1.GetValue(li) ?? DBNull.Value; //can't use null
    }
    dataTable.Rows.Add(row);

    }
    }
    return dataTable;
    }
    catch
    {
    return null;
    }
    }
    }

     -----------------------------------------------------------------两个实体比较,如果值为空则给其赋值

    /// <summary>
    /// 将新实体中的正则提取差异字段值付给原始数据
    /// </summary>
    /// <param name="newEntity"></param>
    /// <returns></returns>
    public RecordEntity CombindDiff(RecordEntity newEntity)
    {
    Type patternType = this.GetType();
    Type newType = newEntity.GetType();
    //获取这个实体的所有属性(字段,属性等 例如 Name,sex等实体中字段)
    PropertyInfo[] patternPInfos = patternType.GetProperties();
    foreach (PropertyInfo patternPInfo in patternPInfos)
    {
    //得到字段的属性列表
    object[] customInfos = patternPInfo.GetCustomAttributes(typeof(PatternAttributes), true);
    if (customInfos == null
    || customInfos.Length == 0)
    continue;
    //获取自定义属性头(实体)
    PatternAttributes patternAtrributes = customInfos.GetValue(0) as PatternAttributes;
    //容器和非正则提取字段都不进行比较
    if (patternAtrributes.IsContainerPattern
    || !patternAtrributes.IsPattern)
    {
    continue;
    }
    //获取对比实体属性值
    object newVal = null;
    //RecordEntity newEntity
    //Type newType = newEntity.GetType();
    //通过属性名得到实体
    PropertyInfo newPatternPInfo = newType.GetProperty(patternPInfo.Name);

    if (newPatternPInfo != null)
    newVal = newPatternPInfo.GetValue(newEntity, null);

    if (patternAtrributes.IsInt32Pattern
    || patternAtrributes.IsDateTimePattern)
    {
    patternPInfo.SetValue(this, newVal, null);
    }
    else
    {
    //当前提取结果是空时
    if (newVal == null
    || newVal.ToString() == "")
    continue;

    patternPInfo.SetValue(this, newVal, null);
    }
    }
    return this;
    }

  • 相关阅读:
    @PathVariable和@RequestParam的区别,@SessionAttributes
    forward和redirect的区别
    JSP页面的静态包含和动态包含
    ConcurrentHashMap源码解析
    Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX
    最小生成树
    tomcat启动项目内存溢出问题
    强引用,弱引用,4种Java引用浅解(涉及jvm垃圾回收)
    CXF 在WAS上报Unmarshalling Error的问题
    CXF处理Date类型的俩种方式
  • 原文地址:https://www.cnblogs.com/aqbyygyyga/p/3444971.html
Copyright © 2020-2023  润新知