转换继承的对象

时间:2012-08-23 17:39:35

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

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

2 个答案:

答案 0 :(得分:9)

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

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

请注意,您可能需要检查prototype 本身MySecond的实例,如果是,请复制该属性。

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

答案 1 :(得分: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; }
}