Клонирование объектов

воскресенье, 19 апреля 2009 г.,

Клонирование объектов, например, каких-нибудь простых DTO (data transfer object) или настроек можно выполнить с помощью MemberwiseClone:
public class Settings
{
    public string Name { get; set; }
    public int Value { get; set; }

    public Settings CloneMemberwise()
    {
        return (Settings)this.MemberwiseClone();
    }
}
По быстродействию это практически аналогично копированию свойств:
public Settings SimpleClone()
{
    return new Settings() { Value = this.Value, Name = this.Name };
}
Но, бывает, что быстродействие некритично, класс невозможно наследовать (у класса определен модификатор sealed), а свойств много:
public sealed class Info
{
    public string Prop1 { get; set; }
    public string Prop20 { get; set; }
}
В таком случае клонировать можно с помощью reflection (отражение) и методов расширения:
public static class InfoHelper
{
    public static Info Clone(this Info src)
    {
        Info ret = new Info();
        foreach (var prop in src.GetType().GetProperties())
        {
            if (prop.CanWrite == false)
                continue;

            var val = prop.GetValue(src, null);
            prop.SetValue(ret, val, null);
        }
        return ret;
    }
}

Надо заметить, что этот способ раз в 6+ медленнее приведенных выше.

Комментариев нет: