SORU
17 EYLÜL 2008, ÇARŞAMBA


Derin klonlama nesneleri

Gibi bir şey yapmak istiyorum:

myObject myObj = GetmyObj(); //Create and fill a new object
myObject newObj = myObj.Clone();

Ve sonra özgün nesne yansıtılan yeni nesne değişiklikleri yapın.

Bilmiyorum genellikle bu işlevi, çok zaman oldu gerekli, ben müracaat için yeni bir nesne yaratmak ve daha sonra kopyalama her özelliği ayrı ayrı, ama hep bırakır benimle duygu olduğunu daha iyi ya da daha şık bir şekilde kullanma durumu.

Nasıl klonlanmış nesne herhangi bir değişiklik orijinal nesnenin yansıması olmadan değiştirilebilir bir nesne clone derin bir kopyası var mı?

CEVAP
17 EYLÜL 2008, ÇARŞAMBA


Buna rağmen, standart bir uygulama olduğu için uygulamak ICloneable arayüz (tarif here, ama bunu yapmayacağım kusturmak), işte sana güzel bir derin klon nesne fotokopi makinesi buldum The Code Project bir süre önce şirket içinde eşyalarımızı.

Daha öncede belirtildiği gibi, nesneleri seri hale getirilebilir olması gerekir.

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

/// <summary>
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
/// </summary>
public static class ObjectCopier
{
    /// <summary>
    /// Perform a deep Copy of the object.
    /// </summary>
    /// <typeparam name="T">The type of object being copied.</typeparam>
    /// <param name="source">The object instance to copy.</param>
    /// <returns>The copied object.</returns>
    public static T Clone<T>(T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        // Don't serialize a null object, simply return the default for that object
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}

Fikir nesne seri hale getirir ve daha sonra taze bir nesne haline de-serialize. Yarar bir nesne çok karmaşık olunca her şey klonlama hakkında endişelenmenize gerek yok.

Ve uzatma yöntemleri (ilk başvurulan kaynaktan da):

Durumda extension methods C# 3.0, değiştir şu imza için bu yöntemi yeni kullanmaya tercih:

public static T Clone<T>(this T source)
{
   //...
}

Şimdi yöntem çağrısı sadece objectBeingCloned.Clone(); olur.

EDİT(10 Ocak 2015) dedim tekrar bu söz geçenlerde başladı kullanarak (Newtonsoft) Json bunu yapmak, should be hafif ve önler yükü [seri hale getirilebilir] etiketler. (NB@atconway özel üyeler klonlanmış olmayan yorumlar JSON yöntemi) kullanarak işaret etti

/// <summary>
/// Perform a deep Copy of the object, using Json as a serialisation method.
/// </summary>
/// <typeparam name="T">The type of object being copied.</typeparam>
/// <param name="source">The object instance to copy.</param>
/// <returns>The copied object.</returns>
public static T CloneJson<T>(this T source)
{            
    // Don't serialize a null object, simply return the default for that object
    if (Object.ReferenceEquals(source, null))
    {
        return default(T);
    }

    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source));
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • Dan Gately

    Dan Gately

    13 AĞUSTOS 2006
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006