2

我想这对你们大多数人来说是一个简单的问题,但我在网上看到的答案都不是我需要的。所以,我有一个基类和另一个继承它的基类:

public class MyBase
{
    public DateAdded { get; set; }
}

public class MySecond : MyBase
{
    public MySecond(MyBase prototype) 
    {
        this = (MySecond)prototype; // this is read-only and does not work
    }

    public DateDeleted { get; set; }
}

如何实例化 MyBase,将其作为原型提供给 MySecond 的另一个实例,并确保后者获取原型的所有值,而无需显式地逐一传输值?

4

2 回答 2

9

你不能,基本上。您可以使用反射以自动方式复制值,但它仍然会一个接一个地复制它们,并且不会让您尽可能多地控制它们的复制方式(例如,您是否需要进行深层复制)。

正如 dasblinkenlight 所说,让每个类负责复制自己的属性可能更合适,除非这不是总是合适的。

请注意,您可能想检查它本身prototype是否是的实例,如果是,则从中复制属性。MySecond

另请注意,如果您使用组合而不是继承,并尝试使类不可变,那么很多时候这种事情变得不必要或微不足道。这并不总是合适的,但我看到很多过度使用继承。

于 2012-08-23T17:41:44.330 回答
7

您不能自动进行复制,但您可以在共享位置进行复制 - 即在MyBase类的构造函数中。prototype这样,如果您将作为基本构造函数的参数传递,所有派生类都可以使用相同的共享代码,如下所示:

public class MyBase {
    public DateAdded { get; set; }
    public MyBase() {
    }
    public MyBase(MyBase other) {
        // Do the copying here
    }
}

public class MySecond : MyBase {
    public MySecond(MyBase prototype) : base(prototype) {
    }

    public DateDeleted { get; set; }
}

编辑(回应评论)

如果您无权访问 的源MyBase,您可以创建一个静态辅助方法来为您进行复制,如下所示:

internal static class MyBaseHelper {
    public static void CopyFromBase(this MyBase target, MyBase source) {
        target.DateAdded = source.DateAdded;
    }
}

现在您可以在派生类中使用它,如下所示:

public class MySecond : MyBase {
    public MySecond(MyBase prototype) {
        this.CopyFromBase(prototype);
    }

    public DateDeleted { get; set; }
}
于 2012-08-23T17:43:28.350 回答