C# 深拷贝

测试实体:

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

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

posted @   double64  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示