我想对大多数人来说这是一个简单的问题,但我在网上看到的答案都不是我需要的.所以,我有一个基类和另一个继承它的基类:
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实例,并确保后者获取原型的所有值,而不是逐个显式地传递值?
基本上你不能.您可以使用反射以自动方式复制值,但它仍然会逐个复制它们,并且不会给予您如何复制它们的控制权(例如,您是否需要进行深层复制) ).
正如dasblinkenlight所述,让每个类负责复制自己的属性可能更合适,除非这不是总是合适的.
请注意,您可能想要检查prototype它本身是否是实例MySecond,如果是,则从中复制属性.
还要注意,如果你使用组合而不是继承,并尝试使类不可变,很多时候这种事情变得不必要或微不足道.它并不总是合适的,但我看到很多过度使用继承.
您不能自动进行复制,但您可以在共享点中进行复制 - 即在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)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |