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