我有一个自定义类
class MyClassA{
public int Width { get; set; }
}
和另一个自定义类B
class MyClassB {
public MyClassA paramClassA;
public int Height { get; set; }
}
有没有办法让MyClassB中的构造函数接受MyClassB类型的参数并自动为属性赋值?
这样的事情:
class MyClassB{
public MyClassA paramClassA;
public int Height { get; set; }
public MyClassB(MyClassB param){
}
public MyClassB(MyClassB param){
// automatically assign properties of param to the instance it is created
}
}
所以我可以这样做:
var classB = new MyClassB();
classB.Height = 100;
classB.paramClassA = new MyClassA();
classB.paramClassA.Width = 100;
var classB2 = new MyClassB(classB);
有办法做到这一点吗?
答案 0 :(得分:1)
没有内置的方法来做到这一点。无论如何,这是复制构造函数的目的,可以通过将现有实例中的所有属性复制到当前实例来实现。但是当你有一个深度的继承链复制时,所有这些成员都可以是非平凡的任务,也包括私有成员。
class MyClassB{
public MyClassA paramClassA;
public int Height { get; set; }
public MyClassB(MyClassB param){
this.Heigth = param.Height;
this.MyClassA = param.MyClassA;
}
}
您还可以实施ICloneable
:
class MyClassB : ICloneable {
public MyClassA paramClassA;
public int Height { get; set; }
public object Clone(){
return new MyClassB
{
this.Height;
this.MyClassA;
};
}
}
答案 1 :(得分:1)
是的,你可以手动完成。请记住differences between shallow copy and deep copy in C# language:
class MyClassB{
public MyClassA paramClassA;
public int Height { get; set; }
public MyClassB(MyClassB param){
Height = param.Height;
paramClassA = new MyClassA();
if (param.paramClassA != null)
{
paramClassA.Width = param.paramClassA.Width;
}
}
}
我会在MyClassB类中推荐Clone
方法:
class MyClassB{
//....
public MyCLassB Clone()
{
var result = new MyClassB
{
Height = Height
};
result.paramClassA = new MyClassA();
if (paramClassA != null)
{
result.paramClassA.Width = paramClassA.Width;
}
}
}
并使用它,如下所示:
var classB = new MyClassB();
classB.Height = 100;
classB.paramClassA = new MyClassA();
classB.paramClassA.Width = 100;
var classB2 = classB.Clone();
答案 2 :(得分:0)
您始终可以创建一个复制方法,该方法将分配值并返回您在其中分配值的MyClassB。如果您必须在构造函数中执行此操作,请查看以下内容。
public MyClassB(MyClassB param)
{
Width = param.Width;
// If you want to keep the same reference classA
paramClassA = param.paramClassA;
// if you want the classA to not be the same reference you could always do.
paramClassA = new MyClassA() { Width = param.Width };
}