转换继承的对象

Mir*_* J. 2 c#

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 9

基本上你不能.您可以使用反射以自动方式复制值,但它仍然会逐个复制它们,并且不会给予您如何复制它们的控制权(例如,您是否需要进行深层复制) ).

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

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

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


das*_*ght 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; }
}
Run Code Online (Sandbox Code Playgroud)

编辑(回应评论)

如果您无权访问源代码MyBase,则可以创建一个静态帮助程序方法,为您执行复制,如下所示:

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

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

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

    public DateDeleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)