我想做的事情如下:
MyObject myObj = GetMyObj(); // Create and fill a new object
MyObject newObj = myObj.Clone();
Run Code Online (Sandbox Code Playgroud)
然后更改未在原始对象中反映的新对象.
我不经常需要这个功能,所以当有必要的时候,我已经使用了创建一个新对象然后单独复制每个属性,但它总是让我觉得有更好或更优雅的处理方式情况.
如何克隆或深度复制对象,以便可以修改克隆对象而不会在原始对象中反映任何更改?
我想要一个真正的深拷贝.在Java中,这很容易,但是你如何在C#中做到这一点?
鉴于以下课程:
class A
{
public List<B> ListB;
// etc...
}
Run Code Online (Sandbox Code Playgroud)
哪个B是可以继承/包含其他类的另一个类.
鉴于这种情况:
A 是一个大类,包含许多引用类型B,[Serializable]因为我无法访问源代码B以下执行深度复制的方法不起作用:
ICloneable或MemberwiseClone作为类A包含许多引用类型A,因为类很大并且不断被添加到,并且包含B无法深度复制的类(如)B,没有可用的源代码)[Serializable]我怎样才能深造课A?
我想做这样的事情:
Button btn1 = new Button();
btn1.Click += new EventHandler(btn1_Click);
Button btn2 = new Button();
// Take whatever event got assigned to btn1 and assign it to btn2.
btn2.Click += btn1.Click; // The compiler says no...
Run Code Online (Sandbox Code Playgroud)
其中btn1_Click已在类中定义:
void btn1_Click(object sender, EventArgs e)
{
//
}
Run Code Online (Sandbox Code Playgroud)
当然,这不会编译("事件'System.Windows.Forms.Control.Click'只能出现在+ =或 - ="的左侧).有没有办法从一个控件获取事件处理程序并在运行时将其分配给另一个控件?如果那是不可能的,重复事件处理程序并在运行时将其分配给另一个控件吗?
有几点:我已经用Google搜索了一段时间,但却发现还没办法做到这一点.大多数尝试过的方法都涉及反射,因此如果您阅读我的问题并认为答案非常明显,请首先尝试在Visual Studio中编译代码.或者,如果答案确实非常明显,请随时给我打电话.谢谢,我真的很期待看到这是否可行.
我知道我可以这样做:
btn2.Click += new EventHandler(btn1_Click);
Run Code Online (Sandbox Code Playgroud)
这不是我在这里寻找的东西.
这也不是我想要的:
EventHandler handy = new EventHandler(btn1_Click);
Button btn1 = new Button();
btn1.Click += handy;
Button btn2 = new Button();
btn2.Click += handy;
Run Code Online (Sandbox Code Playgroud) MSDN给出了这个深拷贝的例子(http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx)
public class Person
{
public int Age;
public string Name;
public IdInfo IdInfo;
public Person ShallowCopy()
{
return (Person)this.MemberwiseClone();
}
public Person DeepCopy()
{
Person other = (Person) this.MemberwiseClone();
other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
return other;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,是否必须实例化一个新的Person对象,然后返回?例如,此代码是否可接受/等于/低于上述代码执行深层复制?
据我了解的是MemberwiseClone()方法,它只执行浅拷贝,即将复制对象的值/引用复制到新对象.由于内存引用相等,这导致浅拷贝,即引用指向相同的对象.
public class Person
{
public int Age;
public string Name;
public IdInfo IdInfo;
public Person ShallowCopy()
{
return (Person)this.MemberwiseClone();
}
public Person DeepCopy()
{
Person other = new Person(); // difference
other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
return other;
} …Run Code Online (Sandbox Code Playgroud)