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

}

相关推荐
小白|5 分钟前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
weixin_5129761710 分钟前
Java 面试宝典 Beta5.0
java
Ting-yu12 分钟前
Spring AI Alibaba零基础速成(5) ---- Memory(记忆)
java·人工智能·后端·spring
月落归舟15 分钟前
一文掌握Spring AOP:从入门到底层原理
java·后端·spring
QuZhengRong18 分钟前
【Luck-Report】缓存
java·前端·后端·vue·excel
月巴月巴白勺合鸟月半22 分钟前
使用RAG完成一个基于本地的知识库的问答
c#
XiYang-DING30 分钟前
【Spring】SpringMVC
java·后端·spring
想学习java初学者31 分钟前
SpringBoot整合GS1编码解码
java·spring boot·后端
日月云棠32 分钟前
2 快速入门实战指南
java·后端
日月云棠33 分钟前
3 Dubbo 2.7 高级配置:检查控制、版本策略与协议选择
java·后端