C#按值复制对象

时间:2017-09-03 07:37:31

标签: c# copy clone return-by-value

我有一个具有许多属性的Object,我需要在每次迭代中创建该对象的副本,以便所有属性都复制到新生对象中,并具有其最后设置的值。 (我无法逐个复制所有属性及其值,因为我的对象实际上是一个自定义用户控件,它具有许多属性,我不知道所有这些属性!)

2 个答案:

答案 0 :(得分:6)

使用JSON序列化程序将对象克隆到另一个对象的方法要简单得多。这个技巧不需要修改或实现克隆类上的接口,只需要像JSON.NET这样的JSON序列化器。

public static T Clone<T>(T source)
{
    var serialized = JsonConvert.SerializeObject(source);
    return JsonConvert.DeserializeObject<T>(serialized);
}

答案 1 :(得分:2)

您可以使用此扩展方法复制所有对象字段和属性。当您尝试复制作为引用类型的字段和属性时,可能会出现一些错误。

public static T CopyObject<T>(this T obj) where T : new()
        {
            var type = obj.GetType();
            var props = type.GetProperties();
            var fields = type.GetFields();
            var copyObj = new T();
            foreach (var item in props)
            {
                item.SetValue(copyObj, item.GetValue(obj));
            }
            foreach (var item in fields)
            {
                item.SetValue(copyObj, item.GetValue(obj));
            }
            return copyObj;
        }

public static T CopyObject<T>(this T obj) where T : new() { var type = obj.GetType(); var props = type.GetProperties(); var fields = type.GetFields(); var copyObj = new T(); foreach (var item in props) { item.SetValue(copyObj, item.GetValue(obj)); } foreach (var item in fields) { item.SetValue(copyObj, item.GetValue(obj)); } return copyObj; }