web-dev-qa-db-ja.com

ジェネリックC#コピーコンストラクタ

私のc#クラスのジェネリックコピーコンストラクター関数を書くための最良の方法は何でしょうか?それらはすべて抽象基本クラスから継承しているので、リフレクションを使用してプロパティをマップできますが、もっと良い方法があるかどうか疑問に思っています。

18
lomaxx

浅いコピーを効率的に作成するには、たとえばExpressionを使用して、事前にコンパイルします。たとえば、 そうです

ディープコピーの場合、シリアル化が最も信頼できるアプローチです。

14
Marc Gravell

コピーコンストラクターとは、基本的に、コピーするオブジェクトである単一のパラメーターがあることを意味します。

また、浅いコピーではなく、深いコピーを実行します。

深いコピーと浅いコピーが何であるかわからない場合は、次のようにします。

フィールドとして整数の単一行を持つクラスをコピーするとします。

浅いコピーは次のようになります。

public class Myclass()
{
    private int[] row;
    public MyClass(MyClass class)
    {
        this.row = class.row
    }
}

ディープコピーは次のとおりです。

public class Myclass()
{
    private int[] row;
    public MyClass(MyClass class)
    {
        for(int i = 0; i<class.row.Length;i++)
        {
            this.row[i] = class.row[i];
        }
    }
}

ディープコピーは実際に実際の値を取得して新しいオブジェクトの新しいフィールドに配置しますが、シャローコピーはポインタのみをコピーします。

浅いコピーでは、次のように設定します。

row[3] = 5;

次に、両方の行を印刷します。両方の印刷では、4番目の数値の値として5が使用されます。ただし、ディープコピーでは、行に同じポインタがないため、最初の印刷のみにこれが含まれます。

23
Vordreller

できれば反射を避けてください。各クラスは、独自のプロパティをコピーし、それをさらに基本メソッドに送信する責任があります。

19
Øyvind Skaar

これが私が使っているコンストラクターです。これは浅いコンストラクターであり、基本クラスの性質上、かなり単純化されていることに注意してください。あなたが始めるのに十分良いはずです。

public partial class LocationView : Location
{
    public LocationView() {}

    // base class copy constructor
    public LocationView(Location value) {
        Type t = typeof(Location);
        PropertyInfo[] properties = t.GetProperties();
        foreach (PropertyInfo pi in properties)
        {
            pi.SetValue(this, pi.GetValue(value, null), null);
        }
    }
    public Quote Quote { get; set; }
}
9
B2K

Valueinjecterおよびfasterflectnugetパッケージを参照して、以下を使用できます。

public class Myclass()
{
    private string _property;
    public MyClass(MyClass obj)
    {
         this.InjectFrom(obj.DeepClone());
    }
}
0
Nikita Ilin