来自 C++ 背景,我发现在 C# 中克隆对象有点难以习惯。为了消除我的一些困惑,我正在寻找一种优雅的方法来将基类型的对象克隆为派生类型。
举例说明:
public class Base
{
public string Member1;
public int Member2;
public float Member3;
public bool Member4;
}
public class Derived : Base
{
public List<Base> Children;
}
Base base = new Base();
然后我想创建一个“Derived”的实例,同时对 Base 对象进行成员复制 - 最好不要手动分配它们。
注意:也许这会更适合值类型?
最佳答案
由于您无法更改对象的类型,因此您有几个选择:
- 封装
基础
- 使用从
Base
复制值的构造函数> - 通过反射或类似方式从
Base
复制属性
对于后者,MiscUtil有一个有用的工具:
Base b= ...
Derived item = PropertyCopy<Derived>.CopyFrom(b);
对于封装:
public class Derived
{
readonly Base b;
public Derived(Base b) {this.b=b;}
public List<Base> Children;
public string Member1 {get {return b.Member1;} set {...} }
public int Member2 {etc}
public float Member3 {etc}
public bool Member4 {etc}
}
或作为手册副本:
public class Derived : Base
{
public Derived(Base b) {
this.Member1 = b.Member1;
// etc
}
// additional members...
}
或者(评论)让基复制自己:
public class Derived : Base
{
public Derived(Base b) : base(b) { }
// additional members...
}
public class Base
{
// members not shown...
public Base() {}
protected Base(Base b) {
this.Member1 = b.Member1;
// etc
}
// additional members...
}
(其中 Base
的构造函数从 Base
初始化字段)
关于c# - 将 C# 引用类型克隆为派生引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1334666/