深复制在Silverlight的扩展方法使用反射? [英] Deep Copy using Reflection in an Extension Method for Silverlight?

查看:103
本文介绍了深复制在Silverlight的扩展方法使用反射?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



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



感谢您。


< DIV CLASS =h2_lin>解决方案

有关数据合同的对象,我们已经使用Silverlight的内深克隆以下的辅助方法:

 公共静态牛逼克隆< T>(T源)
{

DataContractSerializer的序列化=新的DataContractSerializer(typeof运算(T));
使用(MemoryStream的毫秒=新的MemoryStream())
{
serializer.WriteObject(MS,源);
ms.Seek(0,SeekOrigin.Begin);
回报率(T)serializer.ReadObject(MS);
}
}

用于这样的:

  VAR克隆= CloneHelper.Clone< MyDTOType>(dtoVar); 


So I'm trying to find a generic extension method that creates a deep copy of an object using reflection, that would work in Silverlight. Deep copy using serialization is not so great in Silverlight, since it runs in partial trust and the BinaryFormatter does not exist. I also know that reflection would be faster then serialization for cloning.

It would be nice to have a method that works to copy public, private and protected fields, and is recursive so that it can copy objects in objects, and that would also be able to handle collections, arrays, etc.

I have searched online, and can only find shallow copy implementations using reflection. I don't understand why, since you can just use MemberwiseClone, so to me, those implementations are useless.

Thank You.

解决方案

For data contract objects we have used the following helper method for deep cloning within Silverlight:

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);
            }
        }

Used like this:

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

这篇关于深复制在Silverlight的扩展方法使用反射?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆