c# List集合操作帮助类

public class ListHelper

{

#region 赋值转换

/// <summary>

/// A实体转换成B实体

/// </summary>

/// <typeparam name="T"></typeparam>

/// <typeparam name="K"></typeparam>

/// <param name="source">原始数据对象</param>

/// <param name="target">目标对象</param>

/// <returns></returns>

public static K EntityToEntity<T, K>(T source, K target) where T : class, new() where K : class

{

if (source != null && target != null)

{

PropertyInfo[] propertys1 = source.GetType().GetProperties();// 获得此模型的公共属性

PropertyInfo[] propertys = target.GetType().GetProperties();

foreach (PropertyInfo pi in propertys)

{

if (pi.CanWrite && propertys1.Where(ex => ex.Name == pi.Name).Count() > 0)

{

object value = GetProperty(source, pi.Name);

pi.SetValue(target, value, null);

}

}

}

return target;

}

/// <summary>

/// A集合转换成B集合

/// </summary>

/// <typeparam name="T"></typeparam>

/// <typeparam name="K"></typeparam>

/// <param name="source">源数据对象</param>

/// <param name="target">赋值目标对象</param>

public static List<K> ListToList<T, K>(List<T> source, List<K> target) where T : class, new() where K : class, new()

{

if (source != null && target != null)

{

foreach (var item in source)

{

var obj = new K();

EntityToEntity(item, obj);

target.Add(obj);

}

return target;

}

return null;

}

#endregion

#region 属性设置 取值

/// <summary>

/// 实体获取属性值

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="source"></param>

/// <param name="Name"></param>

/// <returns></returns>

public static object GetProperty<T>(T source, string Name) where T : class, new()

{

PropertyInfo[] propertys = source.GetType().GetProperties();// 获得此模型的公共属性

PropertyInfo pi = propertys.Where(ex => ex.Name == Name).FirstOrDefault();

if (pi != null)

{

return pi.GetValue(source, null);

}

return null;

}

/// <summary>

/// 实体设置赋值

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="source"></param>

/// <param name="Name"></param>

/// <param name="value"></param>

/// <returns></returns>

public static bool SetProperty<T>(T source, string Name, object value) where T : class, new()

{

try

{

PropertyInfo[] propertys = source.GetType().GetProperties();// 获得此模型的公共属性

PropertyInfo pi = propertys.Where(ex => ex.Name == Name).FirstOrDefault();

if (pi != null)

{

pi.SetValue(source, value, null);

}

return true;

}

catch

{

return false;

}

}

#endregion

#region List<T>集合转DataTable

/// <summary>

/// List集合转DataTable

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="list"></param>

/// <returns></returns>

public static DataTable ListToDataTable<T>(List<T> list) where T : class, new()

{

var Dt = new DataTable(typeof(T).Name);

PropertyInfo[] propertyInfo = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach (PropertyInfo prop in propertyInfo)

{

Type t = GetCoreType(prop.PropertyType);

Dt.Columns.Add(prop.Name, t);

}

foreach (T item in list)

{

var values = new object[propertyInfo.Length];

for (int i = 0; i < propertyInfo.Length; i++)

{

values[i] = propertyInfo[i].GetValue(item, null);

}

Dt.Rows.Add(values);

}

return Dt;

}

/// <summary>

/// 如果类型为空否则返回类型返回基本类型

/// </summary>

/// <param name="t"></param>

/// <returns></returns>

private static Type GetCoreType(Type t)

{

var flag = !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));//判断属性是否为空

if (t != null && flag)

{

if (t.IsValueType)//值类型

{

return Nullable.GetUnderlyingType(t);

}

}

return t;

}

#endregion

#region 集合值对比

/// <summary>

/// 集合差异比较器,比较两个实体集合值是否一样,

/// true 存在差异 false 不存在差异

/// </summary>

/// <param name="source">源版本实体集合</param>

/// <param name="current">当前版本实体集合</param>

/// <returns>true 存在差异 false 不存在差异</returns>

public static bool ModelComparison<T1, T2>(List<T1> source, List<T2> current) where T1 : class where T2 : class

{

if (source.Count != current.Count) { return true; }

for (int i = 0; i < source.Count; i++)

{

bool flag = ModelComparison(source[i], current[i]);

if (flag) { return flag; }

}

return false;

}

/// <summary>

/// 实体差异比较器,true 存在差异 false 不存在差异

/// </summary>

/// <param name="source">源版本实体</param>

/// <param name="current">当前版本实体</param>

/// <returns>true 存在差异 false 不存在差异</returns>

public static bool ModelComparison<T1, T2>(T1 source, T2 current) where T1 : class where T2 : class

{

Type t1 = source.GetType();

Type t2 = current.GetType();

PropertyInfo[] property1 = t1.GetProperties();

//排除主键和基础字段

foreach (PropertyInfo p in property1)

{

string name = p.Name;

string value1 = p.GetValue(source, null)?.ToString();

string value2 = t2.GetProperty(name)?.GetValue(current, null)?.ToString();

if (value1 != value2)

{

return true;

}

}

return false;

}

#endregion

}

相关推荐
Otaku love travel22 分钟前
老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)
java·tomcat·初始化·动态数据源
DKPT35 分钟前
Java设计模式之行为型模式(责任链模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
L_autinue_Star1 小时前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
晨岳1 小时前
CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境
java·redis·mysql·nginx·centos·tomcat
执笔诉情殇〆1 小时前
前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)
java·服务器·redis·nginx·minio
YuTaoShao1 小时前
【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
java·算法·leetcode·链表
程序员的世界你不懂2 小时前
(20)Java+Playwright自动化测试- 操作鼠标拖拽 - 上篇
java·python·计算机外设
AI360labs_atyun2 小时前
Java在AI时代的演进与应用:一个务实的视角
java·开发语言·人工智能·科技·学习·ai
不像程序员的程序媛3 小时前
redis的一些疑问
java·redis·mybatis
知其然亦知其所以然3 小时前
Java 面试高频题:GC 到底回收了什么、怎么回收、啥时候回收?
java·后端·面试