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

}

相关推荐
ok!ko1 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589361 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰2 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
IT良2 小时前
c#增删改查 (数据操作的基础)
开发语言·c#
yufei-coder2 小时前
掌握 C# 中的 LINQ(语言集成查询)
windows·vscode·c#·visual studio
哎呦没3 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥3 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程4 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇4 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码4 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端