在软件开发过程中,经常需要对对象进行克隆操作,以便在不改变原始对象的情况下进行操作。深度克隆(Deep Clone)是对象克隆的一种方式,它不仅复制对象本身,还复制对象内部的所有成员对象。本文将介绍一个名为FastDeepCloner的工具,它能够高效地实现深度克隆功能。
FastDeepCloner是一个开源的C#库,用于实现对象的深度克隆。它提供了一种简单、高效的方式来复制对象及其所有子对象。与市面上许多其他深度克隆库相比,FastDeepCloner具有更高的自定义性和性能。
要使用FastDeepCloner,可以通过NuGet包管理器轻松地将其添加到项目中。以下是安装步骤:
Install-Package FastDeepCloner
或者,可以通过GitHub克隆源代码到本地:
git clone https://github.com/Alenah091/FastDeepCloner-New-
FastDeepCloner的使用非常简单。以下是一个示例,展示了如何使用FastDeepCloner来克隆一个Employee对象:
using FastDeepCloner;
Employee original = new Employee { Name = "John Doe", Age = 30 };
Employee cloned = new FastDeepCloner(original).Clone();
此外,FastDeepCloner还支持克隆泛型集合,例如List<Employee>:
List originalList = new List { new Employee { Name = "John Doe", Age = 30 } };
List clonedList = new FastDeepCloner(originalList).Clone>();
对于非泛型对象,也可以直接使用Clone方法:
object originalObject = new { Name = "John Doe", Age = 30 };
object clonedObject = new FastDeepCloner(originalObject).Clone();
FastDeepCloner的核心是一个名为FastDeepCloner的类,它通过递归方式深度克隆对象。以下是FastDeepCloner类的实现代码:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
namespace FastDeepCloner
{
private const BindingFlags Binding = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy;
private readonly Type _primaryType;
private readonly object _desireObjectToBeCloned;
public FastDeepCloner(object desireObjectToBeCloned)
{
if (desireObjectToBeCloned == null)
throw new Exception("The desire object to be cloned can't be NULL");
_primaryType = desireObjectToBeCloned.GetType();
_desireObjectToBeCloned = desireObjectToBeCloned;
}
private object DeepClone()
{
if (_desireObjectToBeCloned == null)
return null;
if (_primaryType.IsArray)
return ((Array)_desireObjectToBeCloned).Clone();
object tObject = _desireObjectToBeCloned as IList;
if (tObject != null)
{
var properties = _primaryType.GetProperties();
var customList = typeof(List<>).MakeGenericType((properties[properties.Length - 1]).PropertyType);
tObject = (IList)Activator.CreateInstance(customList);
var list = (IList)tObject;
foreach (var item in (IList)_desireObjectToBeCloned)
{
if (item == null)
continue;
var value = new FastDeepCloner(item).DeepClone();
list?.Add(value);
}
}
else
{
if (_primaryType == typeof(string))
return (_desireObjectToBeCloned as string)?.Clone();
tObject = FormatterServices.GetUninitializedObject(_primaryType);
var fields = _desireObjectToBeCloned.GetType().GetFields(Binding);
foreach (var property in fields)
{
if (property.IsInitOnly)
continue;
var value = property.GetValue(_desireObjectToBeCloned);
if (property.FieldType.IsClass && property.FieldType != typeof(string))
tObject.GetType().GetField(property.Name, Binding)?.SetValue(tObject, new FastDeepCloner(value).DeepClone());
else
tObject.GetType().GetField(property.Name, Binding)?.SetValue(tObject, value);
}
}
return tObject;
}
public object Clone()
{
return DeepClone();
}
public T Clone()
{
return (T)DeepClone();
}
}
FastDeepCloner目前的功能已经非常强大,但作者表示未来可能会进一步优化,例如增加忽略特定属性的功能,以及提高克隆效率。