2013-09-06 6 views
5

bu kodu, bir nesne Dökme:örneğin, ben özdeştir ve sadece adı farklılık gösteren iki kullanıcı tanımlı CLR nesneleri var başka

public class Person 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string LastName { get; set; } 
    public string ETC { get; set; } 
} 

public class PersonData 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string LastName { get; set; } 
    public string ETC { get; set; } 
} 

bu bir nesne oluşturarak yapılabilir biliyoruz ya Bu CLR'lerin ve daha sonra tüm özellikleri tek tek geçmek.

Ama başka bir yolu var mı? Oldukça büyük, 15+ özellikleri olan birkaç CLR var.

[Düzenle] Bazı içerikler. Zaten orada olan sınıflar. EntityFramework kullanarak veritabanından bir model oluşturdum. Veritabanı, sınıflarla neredeyse aynı yapıya sahiptir.

Ayrıca, zaten orada olan çok fazla kod var. Bu sınıflar ayrıca çeşitli arabirimlerden miras alırlar. Şimdi yeniden düzenleme bir seçenek değildir, bu yüzden şimdilik kolay bir düzeltme arıyorum.

+2

onların özelliklerini Yapabileceğiniz tam olarak aynıdır eminseniz o Belki yansıma – BlackBear

+0

bir parça kullanılarak 'Yansıma', ancak neden böyle yapı sınıflarına sahipsin? –

+0

Neden 'Person' nesnesinin' PersonData' için bir referansı tutmuyor? Aka bileşimi. (Bunun kullanım durumunuz olduğunu varsayarsak). –

cevap

8

Her iki sınıfın bir arabirimden miras almasını istemediğinizi varsayarak, Automapper'u deneyebilirsiniz, benzer sınıfları otomatik olarak eşlemek için bir kitaplıktır.

+0

Automapper harika görünüyor, ona bakacağım, teşekkürler! – Quoter

4

Eğer bu sınıfların yazarıysanız, aynı sınıftan, hatta daha iyisi, aynı sınıftan miras almalarını sağlayabilirsiniz. Bu şekilde değerleri birinden diğerine kopyalamak zorunda kalmazsınız - sadece ebeveyn türlerine bir referans kullanın. Unutmayın, tamamen aynı üyelere sahip olan ilişkisiz türlerin çiftleri olması, ASAP tasarımınızı yeniden gözden geçirmeniz gereken bir işarettir.

+0

IConvertible, nesneleri değil, yerel türleri dönüştürmek içindir. –

+0

@Jouni oooops ... Bu noktaya dikkatimi sunuyorum. – Renan

2

Ve sadece şeyiyle uğruna, işte yansıma ile şu şekilde görünür:

var a = new Person() { LastName = "lastn", Name = "name", Address = "addr", ETC = "etc" }; 
var b = new PersonData(); 

var infoPerson = typeof(PersonData).GetProperties(); 
foreach (PropertyInfo pi in typeof(Person).GetProperties()) { 
    object value = pi.GetValue(a, null); 
    infoPerson.Single(p => p.Name == pi.Name) 
     .SetValue(b, value, null); 
} 
+0

Merhaba, örnek için teşekkürler! Bu çok yavaş değil mi? – Quoter

+0

@Suoter: Yavaş olmanıza ne kadar yavaş bağlıdır. Saniyede binlerce yapmak zorunda kalırsanız, bunu yavaş düşünebilirsiniz. Eğer günde binlerce yapman gerekiyorsa, yapmazdınız. – Gabe

+0

@Quoter Gerçekten bilmiyorum .. Yakında bir değerlendirme yapacağım ve sonuçları burada yayınlayacağım – BlackBear