临时提交,新功能未 完成

This commit is contained in:
2025-06-30 20:11:21 +08:00
parent a64065fdda
commit a1de03a94e
7 changed files with 119 additions and 90 deletions

View File

@@ -5,7 +5,6 @@ namespace PMSWPF.Extensions;
public static class ObjectExtensions
{
/// <summary>
/// 复制一个新的对象并返回
/// </summary>
@@ -65,6 +64,11 @@ public static class ObjectExtensions
if (targetProperty != null && targetProperty.CanWrite)
{
object sourceValue = sourceProperty.GetValue(tsource);
// 判断源属性和目标属性是否是泛型列表
bool isSourceList = sourceProperty.PropertyType.IsGenericType &&
sourceProperty.PropertyType.GetGenericTypeDefinition() == typeof(List<>);
bool isTargetList = targetProperty.PropertyType.IsGenericType &&
targetProperty.PropertyType.GetGenericTypeDefinition() == typeof(List<>);
// 场景 1: 属性类型完全相同
if (targetProperty.PropertyType == sourceProperty.PropertyType)
@@ -72,79 +76,82 @@ public static class ObjectExtensions
targetProperty.SetValue(ttarget, sourceValue);
}
// 场景 2: 属性类型不同,但可能是泛型 List<T> 类型
else if(isTargetList && isSourceList)
{
CopyGenericList(ttarget, sourceProperty, targetProperty, sourceValue);
}
else
{
bool isSourceList = sourceProperty.PropertyType.IsGenericType &&
sourceProperty.PropertyType.GetGenericTypeDefinition() == typeof(List<>);
bool isTargetList = targetProperty.PropertyType.IsGenericType &&
targetProperty.PropertyType.GetGenericTypeDefinition() == typeof(List<>);
if (isSourceList && isTargetList)
{
// 获取源列表的元素类型
Type sourceListItemType = sourceProperty.PropertyType.GetGenericArguments()[0];
// 获取目标列表的元素类型
Type targetListItemType = targetProperty.PropertyType.GetGenericArguments()[0];
// 检查列表元素类型名称是否匹配(用于潜在的深拷贝)
if (sourceProperty.Name == targetProperty.Name)
{
// 如果源列表为空,则将目标属性设置为 null
if (sourceValue == null)
{
targetProperty.SetValue(ttarget, null);
continue;
}
// 将源值强制转换为 IEnumerable 以便遍历
var sourceList = (IEnumerable)sourceValue;
// 创建一个目标泛型列表的新实例
// 假设 CreateGenericList 助手方法可用,或按注释创建
// var targetList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(targetListItemType));
IList targetList = CreateGenericList(targetListItemType);
foreach (var item in sourceList)
{
// 确保列表项不为空,然后尝试深拷贝
if (item == null)
{
// 如果源列表项为 null则直接添加到目标列表
targetList.Add(null);
continue;
}
// 创建目标列表元素类型的一个实例
var targetDataItem = Activator.CreateInstance(targetListItemType);
// 递归调用 CopyTo对嵌套对象进行深拷贝
CopyTo(item, targetDataItem);
// 将复制后的项添加到目标列表
targetList.Add(targetDataItem);
}
// 将填充好的目标列表设置给目标对象的属性
targetProperty.SetValue(ttarget, targetList);
}
else
{
// 列表类型匹配,但元素类型名称不匹配。此处跳过,或可实现更复杂的转换。
Console.WriteLine(
$"由于列表元素类型不匹配,跳过属性 '{sourceProperty.Name}':源 '{sourceListItemType.Name}',目标 '{targetListItemType.Name}'");
}
}
else
{
// 类型不同,且都不是泛型 List<T>。此处跳过,或可实现类型转换。
Console.WriteLine(
$"由于类型不匹配,跳过属性 '{sourceProperty.Name}':源 '{sourceProperty.PropertyType.Name}',目标 '{targetProperty.PropertyType.Name}'");
}
}
}
}
}
/// <summary>
/// 复制泛型列表,
/// </summary>
/// <param name="ttarget"></param>
/// <param name="sourceProperty"></param>
/// <param name="targetProperty"></param>
/// <param name="sourceValue"></param>
private static void CopyGenericList(object ttarget, PropertyInfo sourceProperty, PropertyInfo targetProperty,
object? sourceValue)
{
// 获取源列表的元素类型
Type sourceListItemType = sourceProperty.PropertyType.GetGenericArguments()[0];
// 获取目标列表的元素类型
Type targetListItemType = targetProperty.PropertyType.GetGenericArguments()[0];
// 检查列表元素类型名称是否匹配(用于潜在的深拷贝)
if (sourceProperty.Name == targetProperty.Name)
{
// 如果源列表为空,则将目标属性设置为 null
if (sourceValue == null)
{
targetProperty.SetValue(ttarget, null);
return;
}
// 将源值强制转换为 IEnumerable 以便遍历
var sourceList = (IEnumerable)sourceValue;
// 创建一个目标泛型列表的新实例
// 假设 CreateGenericList 助手方法可用,或按注释创建
// var targetList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(targetListItemType));
IList targetList = CreateGenericList(targetListItemType);
foreach (var item in sourceList)
{
// 确保列表项不为空,然后尝试深拷贝
if (item == null)
{
// 如果源列表项为 null则直接添加到目标列表
targetList.Add(null);
continue;
}
// 创建目标列表元素类型的一个实例
var targetDataItem = Activator.CreateInstance(targetListItemType);
// 递归调用 CopyTo对嵌套对象进行深拷贝
CopyTo(item, targetDataItem);
// 将复制后的项添加到目标列表
targetList.Add(targetDataItem);
}
// 将填充好的目标列表设置给目标对象的属性
targetProperty.SetValue(ttarget, targetList);
}
else
{
// 列表类型匹配,但元素类型名称不匹配。此处跳过,或可实现更复杂的转换。
Console.WriteLine(
$"由于列表元素类型不匹配,跳过属性 '{sourceProperty.Name}':源 '{sourceListItemType.Name}',目标 '{targetListItemType.Name}'");
}
}
/// <summary>
/// 辅助方法,用于动态创建泛型 List<T>。
/// </summary>
@@ -155,7 +162,4 @@ public static class ObjectExtensions
Type listType = typeof(List<>).MakeGenericType(itemType);
return (IList)Activator.CreateInstance(listType);
}
}