接受同一类参数的C#构造函数

接受同一类参数的C#构造函数,c#,class,constructor,C#,Class,Constructor,我有一个自定义类 class MyClassA{ public int Width { get; set; } } 还有另一个定制的B级 class MyClassB { public MyClassA paramClassA; public int Height { get; set; } } 有没有办法在MyClassB中有一个构造函数,它接受MyClassB类型的参数并自动为属性赋值 大概是这样的: class MyClassB{ public MyC

我有一个自定义类

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);

有什么方法可以做到这一点吗?

没有内置的方法可以做到这一点。无论如何,这是复制构造函数的目的,可以通过将现有实例中的所有属性复制到当前实例来实现。然而,当您拥有一个深层继承链时,复制所有这些成员可能是一项非常重要的任务,其中也包括私有成员

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;
        };
    }
}

是的,你可以手工做。记住:

我将推荐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();

您总是可以创建一个copy方法来分配值,并返回一个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 };
}

想做就做在构造函数内部
this.paramClassA=param.paramClassA;此高度=参数高度或您从iClonable继承
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 };
}