首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C#引用类型克隆到派生的引用类型

将C#引用类型克隆到派生的引用类型
EN

Stack Overflow用户
提问于 2009-08-26 13:23:51
回答 2查看 1.9K关注 0票数 4

来自C++背景,我发现在C#中克隆对象有点难以适应。为了澄清我的一些困惑,我正在寻找一种优雅的方法来将基类型的对象克隆到派生类型。

举例说明:

代码语言:javascript
复制
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();

有了这些,我想创建一个“派生”的实例,同时创建一个基本对象的成员副本--最好不要手动分配它们。

注意:也许这会更适合值类型?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-26 13:35:38

由于您不能更改对象的类型,因此您有以下几个选项:

封装Base

  • use通过反射或类似的Base 复制来自Base

  • copy的值的构造函数

对于后者,MiscUtil有一个有用的工具:

代码语言:javascript
复制
Base b= ...
Derived item = PropertyCopy<Derived>.CopyFrom(b);

对于封装:

代码语言:javascript
复制
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}
}

或作为手动副本:

代码语言:javascript
复制
public class Derived : Base
{
    public Derived(Base b) {
        this.Member1 = b.Member1;
        // etc
    }
    // additional members...
}

或者(注释)获取base来复制它自己:

代码语言:javascript
复制
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的字段)

票数 4
EN

Stack Overflow用户

发布于 2011-11-07 04:53:29

代码语言:javascript
复制
/// Clone all fields from an instance of base class TSrc into derived class TDst
public static TDst Clone<TSrc, TDst>(TSrc source, TDst target)
    where TDst : TSrc
{
    var bf = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
    foreach (FieldInfo fis in source.GetType().GetFields(bf))
        fis.SetValue(target, fis.GetValue(source));
    return target;
}

/// Create a new instance of a derived class, cloning all fields from type TSrc
public static TDst Clone<TSrc, TDst>(TSrc source)
    where TDst : TSrc, new()
{
    return Clone(source, new TDst());
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1334666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档