深复制在Silverlight的扩展方法使用反射?(Deep Copy using Reflecti

2019-07-03 13:00发布

所以我想找到创建使用反射的对象,这将在Silverlight中工作的深层复制一个通用的扩展方法。 使用深拷贝序列化是不是在Silverlight中那么大,因为它在部分信任运行和BinaryFormatter的不存在。 我也知道,反射会更快然后序列进行克隆。

这将是不错的作品复制公共,私人和保护的领域,并且是递归,以便它可以在对象复制对象的方法,而这也将能够处理集合,数组,等等。

我已经在网上搜,只能找到使用反射浅拷贝实现。 我不明白为什么,因为你可以使用MemberwiseClone,所以对我来说,这些实现是无用的。

谢谢。

Answer 1:

对于数据的合同对象,我们一直使用Silverlight的深处克隆以下helper方法:

public static T Clone<T>(T source)
        {

            DataContractSerializer serializer = new DataContractSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, source);
                ms.Seek(0, SeekOrigin.Begin);
                return (T)serializer.ReadObject(ms);
            }
        }

使用这样的:

var clone = CloneHelper.Clone<MyDTOType>(dtoVar);


Answer 2:

必需的命名空间:

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

方法:

    private readonly static object _lock = new object();

    public static T cloneObject<T>(T original, List<string> propertyExcludeList)
    {
        try
        {
            Monitor.Enter(_lock);
            T copy = Activator.CreateInstance<T>();
            PropertyInfo[] piList = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            foreach (PropertyInfo pi in piList)
            {
                if (!propertyExcludeList.Contains(pi.Name))
                {
                    if (pi.GetValue(copy, null) != pi.GetValue(original, null))
                    {
                        pi.SetValue(copy, pi.GetValue(original, null), null);
                    }
                }
            }
            return copy;
        }
        finally
        {
            Monitor.Exit(_lock);
        }
    }

这不是针对任何方式Silverlight的 - 它只是普通的反思。

书面只会与有一个参数的构造函数对象。 在使用需要的构造参数的对象,则需要在对象[]与参数传递,并使用Activator.CreateInstance方法例如一个不同的过载

T copy = (T)Activator.CreateInstance(typeof(T), initializationParameters);

该propertyExcludeList参数是您希望从副本排除,如果要复制所有属性只是传递一个空的列表例如属性名称的列表

new List<string>()


Answer 3:

你就不能使用普通的.NET反射? 您的序列化对象到MemoryStream ,然后反序列化回来。 这将创建一个深拷贝(最终使用反射),并要求几乎没有任何您的部分代码:

T DeepCopy<T>(T instance)
{
  BinaryFormatter formatter=new BinaryFormatter();

  using(var stream=new MemoryStream())
  {
    formatter.Serialize(stream, instance);
    stream.Position=0;

    return (T)formatter.Deserialize(stream);
  }
}


文章来源: Deep Copy using Reflection in an Extension Method for Silverlight?