.net 浅复制

news/2025/1/15 23:04:19/

你可以使用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}");}
}


http://www.ppmy.cn/news/943145.html

相关文章

在LLM的支持下使游戏NPC具有记忆化的方法

问题 使用GPT这样的LLM去处理游戏中的NPC和玩家的对话是个很好的点子&#xff0c;那么如何处理记忆化的问题呢。 因为LLM的输入tokens是有限制的&#xff0c;所以伴随着问题的记忆context是有窗口大小限制的&#xff0c;将所有的记忆输入LLM并不现实。 所以这里看到了stanfo…

【Python】简单计算器实现(四)

解决思路&#xff1a;最后&#xff0c;我们来看看最简单的运算函数和判断运算符函数。 定义函数&#xff1a;def calculate(n1, n2, operator) param n1: floatparam n2: floatparam operator: - * /return: float def calculate(n1, n2, operator):result 0if operator …

win7,win10下删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\报错

在调试虚拟网卡驱动时&#xff0c;由于修改错误&#xff0c;导致枚举顺序错乱&#xff0c;因此通过删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\WINTUN下的所有项&#xff0c;即可&#xff0c;win10可用。 1、下载PStools&#xff1a; http://technet.microsoft.c…

【懒人版】labview 软件加密+试用期限制+绑定硬件

labview编译的软件如何在无加密狗的情况下绑定系统硬件生成机器码和注册码&#xff0c;增加试用期功能。获取硬件序列号&#xff0c;对序列号加密&#xff0c;通用密钥生成机器码&#xff0c;在客户端生成机器码&#xff0c;在服务器端生成注册码。 该例程实现如下功能&#xf…

STM32软件加密

摘要&#xff1a; 知识产权的保护&#xff0c;如何让自已辛勤的劳动成果不被别人抄袭&#xff0c;采用有效的手段对IC加密是值得每一个设计者关注的问题。 当然&#xff0c;有人说&#xff0c;没有解不了密的IC&#xff0c;的确&#xff0c;解密是一项技术&#xff0c;只要有人…

RK3399平台开发系列讲解(项目实践篇)1.10、如何完成软硬件的绑定,从而做到软件加密

平台内核版本安卓版本RK3399Linux4.4Android7.1文章目录 目标思路加密芯片方式(嵌入式产品设计初期)GPIO 管脚上下拉方式(嵌入式产品成熟阶段)目标 防止软件被别人盗用比较有效的方法是通过软件和硬件配合修改,起到软硬件绑定的作用。 分两种情况: 设计初期,电路设计阶…

加密狗厂商及工作原理介绍

加密狗厂商及工作原理介绍 厂商介绍工作原理加密方案主要特点 厂商介绍 在当今中国市场上最主要的加密锁品牌有&#xff1a;   1、美国彩虹公司&#xff08;也是最早做硬件加密的公司&#xff09;的国产品牌“加密狗”、美国品牌“圣天诺软件加密锁”&#xff1b;    2、阿…

软件加密方案简介

做为软件开发者,研究好软件加密的确很重要,不过也很有必要多了解一些关于加密狗解密和破解的知识,加密和破解就像矛和盾一样,对于解密知识了解的越多,那么编写的加密代码就越好,要知道加密永远都比解密要容易的多,只有知己知彼,方能百战百胜。 以下就针对使用加密狗…