读书人

C#的深复制如何如此难

发布时间: 2012-03-29 12:53:12 作者: rapoo

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,如果加入的数据,超过一定的阈值时候,便会重新动态开辟空间,再拷贝原来的元素,期间会发生类的对象的构造,析构等行为,导致效率可能有些问题!
希望大家多交流,欢迎访问我的空间.

读书人网 >C#

热点推荐