你可以使用C#编程语言来编写一个通用的扩展方法,用于将一个对象的值复制到另一个对象,并且修改目标对象的属性时原始对象不受影响。
以下是一个示例代码:
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;}
可以按照以下方式使用该扩展方法:
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}");}
}