来自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();有了这些,我想创建一个“派生”的实例,同时创建一个基本对象的成员副本--最好不要手动分配它们。
注意:也许这会更适合值类型?
发布于 2009-08-26 13:35:38
由于您不能更改对象的类型,因此您有以下几个选项:
封装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...
}或者(注释)获取base来复制它自己:
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的字段)
发布于 2011-11-07 04:53:29
/// 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());
}https://stackoverflow.com/questions/1334666
复制相似问题