日期:2014-05-18  浏览次数:20815 次

C#的深复制怎么如此难?
我有一个类,里面使用了属性更新通知.
C# code

[Serializable]
    public class DomainBase : INotifyPropertyChanged
    {
        #region 基类属性
        /// <summary>
        /// 基类属性
        /// </summary>
        private int _id;
        public virtual int ID 
        {
            get
            {
                return _id;
            }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    PropChanged();
                }
            }
        }

        private string _no;
        public virtual string NO 
        {
            get
            {
                return _no;
            }
            set
            {
                if (value != _no)
                {
                    _no = value;
                    PropChanged();
                }
            }
        }

        private bool _isChanged;
        public virtual bool IsChanged
        {
            get
            {
                return _isChanged;
            }
        }
        #endregion

        #region 属性更新通知
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected void PropChanged()
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                _isChanged = true;
                string name = new StackTrace().GetFrame(1).GetMethod().Name.Substring(4);
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
        #endregion
    }


我想在修改前保存原始状态,但现在找到的办法都不能达到要求。

如果使用序列化进行深复制,那么属性更新通知不能复制,会引发绑定问题。
仿照的例子:
C# code
http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx


如果使用反射,我现在只看到两个这方面的例子:
一个是使用公共字段,而我的类是使用属性的。
仿照的例子:
C# code
http://www.codeproject.com/KB/cs/cloneimpl_class.aspx


另一个是只能复制值属性,这个根本就不能用。
仿照的例子:
C# code
http://goneale.com/2009/02/16/cloning-object-properties-via-reflection/


有没有完美一点的深复制方案呢?

------解决方案--------------------
序列化就是最好的深度复制。
不明白楼主要实现什么功能,事件是不能复制的,但你可以之后手动绑定。
------解决方案--------------------
我想在修改前保存原始状态。用static 保存一个副本
------解决方案--------------------
什么叫做“深复制”?引用相同的 Method,叫做“深复制”吗?到底什么叫做“深复制”,到底想干什么你说吧!
------解决方案--------------------
事件怎么能复制和序列化?
------解决方案--------------------
深复制好象不是这个概念啊
如果按你想的那样,可以建立一个程序的副本,当主程序出现问题时调用副本程序
------解决方案--------------------
如果使用序列化进行深复制,那么属性更新通知不能复制,会引发绑定问题。

其实不是属性更新通知不能复制,也不是绑定的问题,是因为绑定到的对象不能被序列化。
序列化和深复制不是一个概念,最好还是别用序列化,大部分情况下用MemberwiseClone就可以了,否则按自己的需要实现ICloneable。
复制是不应该把绑定也复制过来的,能复制的仅仅是数据,否则的话会造成混乱。你应该在复制之后重新进行绑定。
------解决方案--------------------
深度复制应该指:深拷贝吧,浅拷贝问题; 另外还有就是容器的实现原理了,不知道楼主的意思是;例如:c++中的vector,如果加入的数据,超过一定的阈值时候,便会重新动态开辟空间,再拷贝原来的元素,期间会发生类的对象的构造,析构等行为,导致效率可能有些问题!
希望大家多交流,欢迎访问我的空间.