[英]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.