c# - 将 C# 引用类型克隆为派生引用类型

标签 c# clone reference-type

来自 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/

相关文章:

Java二叉树克隆问题

c# - 什么时候值类型包含引用类型?

c++ - 引用类型的专用函数模板

c# - "new"关键字前引用类型的值

c# - 如何在不需要等待当前函数/线程的结果的情况下运行异步任务?

c# - Json解析器异常解析值时遇到意外字符: S.路径 '',第0行,位置0

c# - 验证 C# 项目的所有 Git 提交是否在重写历史后编译

git - 如何克隆旧的 GIT 提交

c# - MemoryStream 和深度克隆

c# - 获取 Oracle 数据库名称