首页 > 编程语言 >C# 深拷贝

C# 深拷贝

时间:2022-11-03 20:56:53浏览次数:35  
标签:set obj Name get C# Second 拷贝 public

测试实体:

class Test
{
    public int Age { get; set; } = 1;
    public string Sex { get; set; } = "男";
    public Name Name { get; set; } = new Name() { Name_ = "周杰伦", Second = new Second() { Num = 1 } };
}
class Name
{
    public string Name_ { get; set; }
    public Second Second { get; set; }
}

class Second
{
    public int Num { get; set; }
}

测试:


public static T DeepCopy<T>(T obj)
{
    //如果是字符串或值类型则直接返回
    if (obj is string || obj.GetType().IsValueType) return obj;

    object retval = Activator.CreateInstance(obj.GetType());
    FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    foreach (FieldInfo field in fields)
    {
        try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
        catch { }
    }
    return (T)retval;
}

static void Main()
{
    Test test = new Test();
    Console.WriteLine(test.Name.Second.Num);

    Test test1 = DeepCopy(test);
    test1.Name.Second.Num = 100;
    Console.WriteLine(test1.Name.Second.Num);
    Console.WriteLine(test.Name.Second.Num);

    Console.ReadKey();
}

输出:

1
100
1

可见,不影响之前的对象。

标签:set,obj,Name,get,C#,Second,拷贝,public
From: https://www.cnblogs.com/huvjie/p/16855795.html

相关文章

  • cv-画RGB直方图
    python代码importcv2frommatplotlibimportpyplotaspltimportsysif__name__=="__main__":print("PYfileargvis:",sys.argv[1])path=sys.ar......
  • Controller输出JSON数据 乱码解决方案
    ​我们可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置!<mvc:annotation-driven><mvc:message-convertersregister-defaults="true">......
  • CodeForces 1540B Tree Array
    CF传送门洛谷传送门很强的一个题。发现根的选择很重要,于是考虑先枚举根。考虑枚举两个点对\(i,j\(i<j)\),如果\(j\)比\(i\)先被标记,那么\(i,j\)就贡献了一个逆......
  • 福建WC2014 路径权值(Kruskal重构树 + 树状数组)
    题目描述:给定一个带权树,树上任意两点间的路径权值\(d\left(x,y\right)\)定义为\(x,y\)这两个点之间路径上的最小值,树上任意一点x的权值定义为这个点到树上其他所有点......
  • SpringMVC中的@RestController
    在Spring中@RestController的作用等同于@Controller+@ResponseBody。所以想要理解@RestController注解就要先了解@Controller和@ResponseBody注解。@Controller之前已......
  • 协程的async使用
    async与launch一样都是开启一个协程,但是async会返回一个Deferred对象,该Deferred也是一个job async函数类似于launch函数.它启动了一个单独的协程,这是一个轻量级的线程......
  • oracle 存储过程使用
    创建存储过程createprocedureWMSendObj(orginvarchar2,deptinvarchar2)ascursorcurssis(selectdistinctcnofromHR_ARC_DISPAT......
  • cookie、session和token理解
    1.cookieCookie是浏览器在电脑本地保存数据的一种机制,浏览器通过cookie这种机制可以在浏览器上保存用户在浏览器上浏览过的商品,或者在浏览器通过cookie记录一个布尔类型......
  • .Net Excel 的帮助方法
    ///<summary>///读取Excel流到DataSet///</summary>///<paramname="stream">Excel流</param>///<paramname="dict">......
  • np.clip()
    参数数量及其作用np.clip是一个截取函数,用于截取数组中小于或者大于某值的部分,并使得被截取部分等于固定值。函数如下:np.clip( a, a_min, a_max, out=None):......