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

}

相关推荐
天天摸鱼的java工程师7 分钟前
深入理解 Spring 核心:IOC 与 AOP 的原理与实践
java·后端
漫步者TZ8 分钟前
【Netty系列】解决TCP粘包和拆包:LengthFieldBasedFrameDecoder
java·网络协议·tcp/ip·netty
愿你是阳光060734 分钟前
Java-redis实现限时在线秒杀功能
java·redis·bootstrap
我爱Jack42 分钟前
Spring Boot统一功能处理深度解析
java·spring boot·后端
苦学编程的谢1 小时前
Java网络编程API 1
java·开发语言·网络
寒山李白1 小时前
Java 依赖注入、控制反转与面向切面:面试深度解析
java·开发语言·面试·依赖注入·控制反转·面向切面
casual_clover1 小时前
Android 之 kotlin语言学习笔记三(Kotlin-Java 互操作)
android·java·kotlin
AA-代码批发V哥1 小时前
Java正则表达式完全指南
java·正则表达式
还不起来学习?2 小时前
常见算法题目5 -常见的排序算法
java·算法·排序算法
Java菜鸟、2 小时前
设计模式(代理设计模式)
java·开发语言·设计模式