2011-12-21 14 views
0

Delphiは、ここで言い換え1つの目的は、相互にコピーすることができる標準的なメカニズムを持っています。DelphiのAssign/AssignToに対応する.NET対応の構文はありますか?

class Persistent 
{ 
    protected AssignError(Persistent source) 
    { 
     throw new ConvertError("Cannot assign a {0} to a {1}", source.GetType().Name, this.GetType().Name); 
    } 

    protected virtual AssignTo(Persistent destination) 
    { 
     destination.AssignError(this); 
    } 

    public virtual Assign(Persistent source) 
    { 
     source.AssignTo(this); 
    } 
} 

は、.NET FCLは、互いの間のオブジェクトのコピーの標準構文を有していますか?

例えば:

interface IPersistent 
{ 
    public virtual Assign(Object source); 
} 

public class User : IPersistent 
{ 
    private Image avatarThumbnail; 
    private String name; 

    public override Assign(Object source) 
    { 
     if (source is User) 
     { 
      this.avatarThumbnail = source.avatarThumbnail; 
      this.name = source.Name; 
     } 
     else if (source is Image) 
      avatarThumbnail = (Image)source; 
     else if (source is DirectoryEntry) 
      name = ((DirectoryEntry) source).Firstname + " " + ((DirectoryEntry) source).Lastname; 
     else 
      throw new AssignError("Assign from {0}", source.GetType()); 
    } 
} 

はい、私はちょうど標準IPersistentインタフェースを考案。お互いにオブジェクトをコピーするメカニズムはすでに存在していますか?

更新

:私は、オブジェクトのクローンを作成する反対について話しています。

User originalUser = new User(); 
User theClone = originalUser.Clone(); 
theClone.Lastname = "Guyer"; 

originalUser.Assign(theClone); 

それとも、私もまったくクローンを持っている必要はありません。

User u = new User(); 
u.Assign(salesOrder); //copy name/e-mail from the sales order 

または

SalesOrder s = new SalesOrder(); 
s.SalesOrderDate = DateTime.Now; 
User customer = new Customer("Kirsten"); 
s.Assign(user); //copy sold-to/ship-to information from the user 
+0

が、あなたはVSでこれを行うかのDelphi 2010の内側にプリズムを使用している – MethodMan

+0

それは依存します - あなたは、代入文があるとき、これらの関数は自動的に呼ばれることを期待しています遭遇? (la C++のコピーコンストラクタ) - もしそうなら、答えはノーです。 –

+0

@DJKRAZE Visual Studio –

答えて

2

.NETフレームワークがICloneableインターフェースを持っています

クローニングをサポートしています。これにより、クラスの新しいインスタンスが作成されます。既存のインスタンスと同じ値。

そして:

ICloneableインターフェースはMemberwiseCloneによって供給されるものを超えて、クローニングをサポートすることを意図している一方の部材、Cloneを含んでいます。クローニング、深いコピーと深いコピー、および例の詳細については、Object.MemberwiseCloneメソッドを参照してください。


更新:

私の知る限りでは、あなたが望むものと同等のものBCLに(異なるオブジェクト間の一部値をコピーするための標準的な方法は)ありません。

+0

仕様'クローン'が深いコピーか浅いコピーのどちらかとして実装されるようにします。したがって、他人が提供する 'ICloneable'を使うときは注意が必要です。 – Brian

+0

「ICloneable」インターフェースを参照するのは間違いです。なぜなら、それは[役に立たなくなり、時代遅れと思われる](http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx)であるからです。それを使用する誰に対してもフレームワーク設計ガイドラインのアドバイス。 'ICloneable'を実装していないオブジェクトの' Clone'メソッドよりも利点はありません。 – Steven

+1

@Steven - MSDNのドキュメントには、旧式であることは記載されていません。また、OPが求めていることに最も近いものです。 – Oded

0

標準のICloneableインターフェイスの代わりに、リフレクションを使用してパブリックプロパティ/フィールドのコピーを実行できます。ここではそのようにするための私の頭の上をオフに書かれたいくつかのコードです:

foreach(PropertyInfo mbr in src.GetType().GetProperties()) 
    mbr.SetValue(dst, src.GetValue(src, BindingFlags.GetProperty, null, null, null), BindingFlags.SetProperty, null, null, null) 

foreach(FieldInfo mbr in src.GetType().GetFields()) 
    mbr.SetValue(dst, src.GetValue(src, BindingFlags.GetField, null, null, null), BindingFlags.SetField, null, null, null) 
+0

私は既にクローニングしています(http://stackoverflow.com/a/78612/12597)。問題は今クローンをオリジナルにコピーすることです。 –

+0

これは['MemberwiseClone'](http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx)を使用するよりもどのように優れていますか? – Brian

+0

@Brian - 多くの点でそうではありません。 'MemberwiseClone'は、同様のプロセスのネイティブ実装です。私が自分でそれを実装することの唯一の利点は、どのフィールドがコピーされ、どの深さに制御されるべきかというニッチな状況にあります。しかし、元の質問と実際には関係ありません。 –

関連する問題