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

}

相关推荐
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2342 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
测开小菜鸟4 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity4 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天5 小时前
java的threadlocal为何内存泄漏
java
caridle5 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^5 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋35 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花5 小时前
【JAVA基础】Java集合基础
java·开发语言·windows