none
利用反射进行深拷贝 RRS feed

  • 问题

  • public void CopyValues(AppSettingsClass source)
    {
           Type type = this.GetType();
    
           foreach (FieldInfo fi in type.GetFields())
                fi.SetValue(this, fi.GetValue(source));
    
           foreach (PropertyInfo pi in type.GetProperties())
                pi.SetValue(this, pi.GetValue(source, null), null);
    }
    我想通过以上的代码对类进行拷贝,但是发现类中的引用属性得到的是浅拷贝,希望有高手指教一下,如何将上面的代码变成深拷贝
    2010年4月11日 11:31

答案

  • 另外一条路,序列化之后再反序列化,则肯定是深度拷贝了,当然条件比较苛刻,某些情况下可以用用。
    霸王

    脑筋急转弯^o^


    能用就行。

    另外,DeepClone 的行为是不可预期的,做了也没什么意义。比如牵涉到文件句柄的话,是把整个文件都复制一份呢还是如何?具体行为还是由当事人来决定比较好……


    霸王
    • 已标记为答案 漫步者 2010年4月16日 8:40
    2010年4月12日 12:11

全部回复

  • 另外一条路,序列化之后再反序列化,则肯定是深度拷贝了,当然条件比较苛刻,某些情况下可以用用。
    霸王
    2010年4月12日 2:12
  • 最大控制力度的话,最好是自定义一个 IDeepClone.DeepClone() ,然后让你的类都集成这个接口。 默认实现用反射,然后对于特殊的用自己写代码。

    这样做最保险,拷贝预期完全可控。就是工作量稍微大一些。

    要是微软能够提供默认的IDeepClone实现就好了。。。。切~~~

    2010年4月12日 8:11
  • 另外一条路,序列化之后再反序列化,则肯定是深度拷贝了,当然条件比较苛刻,某些情况下可以用用。
    霸王

    脑筋急转弯^o^
    2010年4月12日 8:12
  • 另外一条路,序列化之后再反序列化,则肯定是深度拷贝了,当然条件比较苛刻,某些情况下可以用用。
    霸王

    脑筋急转弯^o^


    能用就行。

    另外,DeepClone 的行为是不可预期的,做了也没什么意义。比如牵涉到文件句柄的话,是把整个文件都复制一份呢还是如何?具体行为还是由当事人来决定比较好……


    霸王
    • 已标记为答案 漫步者 2010年4月16日 8:40
    2010年4月12日 12:11
  • 你好,

    似乎没有什么比较好的现成的办法。

    你要么用反射重新创建一个该类的实例,然后一个个属性赋值试试。似乎太麻烦了,得一层层找下去,直到所有类型都是值类型了。


    Microsoft Online Community Support
    2010年4月13日 2:56