Существует ли эквивалентный синтаксис .NET для Assign / AssignTo Delphi? - PullRequest
0 голосов
/ 22 декабря 2011

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

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

.NET Framework имеет интерфейс ICloneable:

Поддерживает клонирование, которое создает новый экземпляр класса с тем же значением, что и существующий экземпляр.

И:

Интерфейс ICloneable содержит один элемент, Clone, который предназначен для поддержки клонирования помимо того, что предоставляется MemberwiseClone.Дополнительные сведения о клонировании, глубоких и полных копиях и примерах см. В методе Object.MemberwiseClone.


Обновление:

Насколько я знаю, ничего нетэквивалентно тому, что вы хотите (стандартный способ скопировать некоторые значения между различными объектами) в BCL.

0 голосов
/ 22 декабря 2011

В качестве альтернативы стандартному интерфейсу 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)
...