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

时间:2016-11-25 11:59:08

标签: 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 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);

有办法做到这一点吗?

3 个答案:

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