簡體   English   中英

是否有與Delphi的Assign / AssignTo相同的.NET語法?

[英]Is there a .NET equivalent syntax to Delphi's Assign/AssignTo?

Delphi有一個標准機制,一個對象可以從另一個對象復制,在這里解釋為:

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

.NET框架具有ICloneable接口:

支持克隆,它創建一個具有與現有實例相同值的類的新實例。

和:

ICloneable接口包含一個成員Clone ,用於支持MemberwiseClone提供的克隆。 有關克隆,深拷貝和淺拷貝以及示例的詳細信息,請參閱Object.MemberwiseClone方法。


更新:

據我所知,在BCL中沒有任何東西與你想要的東西相同(在不同對象之間復制某些值的標准方法)。

作為標准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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM