你可以使用C#编程语言来编写一个通用的扩展方法,用于将一个对象的值复制到另一个对象,并且修改目标对象的属性时原始对象不受影响。
以下是一个示例代码:
cs
public static T ShallowCopy<T>(this T original) where T : class
{
if (original == null)
{
return null;
}
// 创建一个新实例
T copy = Activator.CreateInstance<T>();
// 获取原始对象的所有属性
var properties = typeof(T).GetProperties();
foreach (var property in properties)
{
// 如果属性是一个引用类型或是List集合,进行浅拷贝
if (property.PropertyType.IsClass && property.PropertyType != typeof(string)
|| property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
{
var originalValue = property.GetValue(original);
if (originalValue != null)
{
if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
{
// 如果属性是List集合,复制集合元素
var originalList = (System.Collections.IList)originalValue;
var copyList = (System.Collections.IList)Activator.CreateInstance(property.PropertyType);
foreach (var item in originalList)
{
copyList.Add(item);
}
property.SetValue(copy, copyList);
如果属性是List集合,复制集合元素
//var originalList = (System.Collections.IList)originalValue;
//var copyList = originalList.Cast<object>().ToList();
//property.SetValue(copy, copyList);
}
else
{
// 其他引用类型的属性,进行递归浅拷贝
var clonedObject = ShallowCopy(originalValue);
property.SetValue(copy, clonedObject);
}
}
}
else
{
// 该属性是一个值类型,直接复制
var originalValue = property.GetValue(original);
property.SetValue(copy, originalValue);
}
}
return copy;
}
可以按照以下方式使用该扩展方法:
cs
public class A
{
public int Foo { get; set; }
public string Bar { get; set; }
}
public class B
{
public int Foo { get; set; }
public string Bar { get; set; }
}
public class Program
{
static void Main()
{
A a = new A { Foo = 42, Bar = "Hello" };
B b = new B();
b=a.ShallowCopy();
Console.WriteLine($"a: Foo = {a.Foo}, Bar = {a.Bar}");
Console.WriteLine($"b: Foo = {b.Foo}, Bar = {b.Bar}");
b.Foo = 100; // 修改b对象的属性值
Console.WriteLine($"a: Foo = {a.Foo}, Bar = {a.Bar}");
Console.WriteLine($"b: Foo = {b.Foo}, Bar = {b.Bar}");
}
}