Cevap Geçmişi
12.04.16 13:28
Şuradan öğrendiğime göre Code Project 'de bulunan alttaki örnek ICloneable arayüzünü kullanmadan yani her sınıfımızda bunu uygulamak zorunda kalmadan serileştirme yoluyla klonlama yapıyor. Biraz kısaltıp Türkçeleştirdim. /// Nesneleri derin kopyalama yapan bir metod. /// Koplamala için ikili serileştirmeyi (Binary Serialization) kullanır. public static class ObjectCopier { public static T Clone<T>(T source) { // Serileştirilemeyen sınıfların örnekleri için hata döndür. if (!typeof(T).IsSerializable) { throw new ArgumentException("Tip serileştirilebilir olmalıdır.", "source"); } // null'u serileştirmeye çalışma, karşılığında tipin varsayılan // değerini döndür. 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); } } } Kullanım örneği: // abc metnini içeren bir StringBuilder oluştur ve klonla StringBuilder sb = new StringBuilder("abc"); StringBuilder sbc = ObjectCopier.Clone<StringBuilder>(sb); Console.WriteLine(sb.ToString()); Console.WriteLine(sbc.ToString()); Çıktı: abc abc
Ekleyen: cevapsitesi
Değiştiren: cevapsitesi
Cevap olarak seçen: canora
12.04.16 10:27
Şuradan öğrendiğime göre Code Project 'de bulunan alttaki örnek ICloneable arayüzünü kullanmadan yani her sınıfımızda bunu uygulamak zorunda kalmadan serileştirme yoluyla klonlama yapıyor. Biraz kısaltıp Türkçeleştirdim. /// Nesneleri derin kopyalama yapan bir metod. /// Koplamala için ikili serileştirmeyi (Binary Serialization) kullanır. public static class ObjectCopier { public static T Clone<T>(T source) { // Serileştirilemeyen sınıfların örnekleri için hata döndür. if (!typeof(T).IsSerializable) { throw new ArgumentException("Tip serileştirilebilir olmalıdır.", "source"); } // null'u serileştirmeye çalışma, sen de null gönder 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); } } } Kullanım örneği: // abc metnini içeren bir StringBuilder oluştur ve klonla StringBuilder sb = new StringBuilder("abc"); StringBuilder sbc = ObjectCopier.Clone<StringBuilder>(sb); Console.WriteLine(sb.ToString()); Console.WriteLine(sbc.ToString()); Çıktı: abc abc
Ekleyen: cevapsitesi
En fazla 3 eski durum gösterilir.