【术】c#中利用反射实现深拷贝

c#中深拷贝不常用,但是需要的时候如果没有,实在是麻烦的很。今天聊天,中梁大神说他实现了一个,赶紧学习学习。废话少说,直接上代码。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

public class CloneHelper
{
    public static object Clone(object obj)
    {
        Type type = obj.GetType();
        object clone_obj = System.Activator.CreateInstance(type);
        Copy(clone_obj, obj, type);
        return clone_obj;
    }

    public static void Copy<T>(T dst, T src)
    {
        Copy(dst, src, typeof(T));
    }

    static void Copy(object dst, object src, Type type)
    {
        if (type.IsGenericType)
        {
            if (type.GetInterface("IList") != null)
            {
                IList list_obj = src as IList;
                IList list_clone_obj = dst as IList;
                foreach (object ele in list_obj)
                {
                    Type ele_type = ele.GetType();
                    if (ele_type.IsPrimitive || ele_type.IsValueType || ele_type == typeof(String))
                    {
                        list_clone_obj.Add(ele);
                    }
                    else
                    {
                        list_clone_obj.Add(Clone(ele));
                    }
                }
                return;
            }
            else if (type.GetInterface("IDictionary") != null)
            {
                IDictionary dict_obj = src as IDictionary;
                IDictionary dict_clone_obj = dst as IDictionary;
                foreach (object key in dict_obj.Keys)
                {
                    object value = dict_obj[key];
                    Type key_type = key.GetType();
                    if (key_type.IsPrimitive || key_type.IsValueType || key_type == typeof(String))
                    {
                        if (key_type.IsPrimitive || key_type.IsValueType || key_type == typeof(String))
                        {
                            dict_clone_obj.Add(key, value);
                        }
                        else
                        {
                            dict_clone_obj.Add(key, Clone(value));
                        }
                    }
                    else
                    {
                        if (key_type.IsPrimitive || key_type.IsValueType || key_type == typeof(String))
                        {
                            dict_clone_obj.Add(Clone(key), value);
                        }
                        else
                        {
                            dict_clone_obj.Add(Clone(key), Clone(value));
                        }
                    }

                }
                return;
            }
        }

        FieldInfo[] fields = type.GetFields();
        foreach (FieldInfo field in fields)
        {
            if (field.IsStatic)
            {
                continue;
            }
            if (field.FieldType.IsPrimitive || field.FieldType.IsValueType || field.FieldType == typeof(String))
            {
                field.SetValue(dst, field.GetValue(src));
            }
            else
            {
                object field_value = field.GetValue(src);
                if (field_value != null)
                {
                    field.SetValue(dst, Clone(field_value));
                }
            }
        }
    }
}

总体思路就是利用反射拿到字段(Field),然后拷贝字段。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值