4

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();

それで、Baseオブジェクトのメンバーごとのコピーを実行しながら、できれば手動で割り当てずに、「Derived」のインスタンスを作成したいと思います。

注:おそらくこれは値型により適していますか?

4

2 に答える 2

4

オブジェクトのタイプを変更できないため、いくつかのオプションがあります。

  • カプセル化 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'sコンストラクターはからのフィールドを初期化しますBase

于 2009-08-26T13:35:37.597 に答える
2
/// 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());
}
于 2011-11-06T20:53:28.803 に答える