2011-01-14 14 views
8

Yani var (Bu örnek için basitleştirilmiş) böyle iki özel karmaşık türleri:başka bir özel karmaşık tür için özel bir kompleks türüne dönüştürmek için nasıl

public class PendingProduct 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int ColorCount { get; set; } 
} 

ı kendisini dönüştürme bilmek için bu nesneyi gerek diyelim başka bir türe: Ben Ürüne PendingProduct dönüştürmek için bir yöntem çağırdığınızda

public class Product 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public ProductColors Colors { get; set;} 
} 

Yani, ProductColor ait "ColorCount" numara Ürün sınıfına nesneleri ekler bazı özel mantık yürütmek gerekir. Bu tamamen basitleştirilmiş, ancak sınıfın mimarisi burada gerçekten anlamsız. benim ana soru nedir

şudur ki:

Ne nesnelerin özellikleri farklılık olduğunda başka karmaşık tür bir karmaşık tür dönüşümünü uygulamak için kullanılacak en iyi uygulama yöntemidir? Gerçek dünyada

, özellikleri çok farklıdır ve ben Açıkçası

Ben sadece bir giriş parametre alır bir fonksiyon yazabiliriz B.

Nesne Nesne A'dan gerekenleri eşlemek için bazı özel mantık yazacaksınız A nesnesi ve nesne B döndürür, ancak daha "En İyi Uygulama" yöntemini arıyorum. IConvertible burada oynar mı? İstediğimi yapmak için bir işlev yazmaktan ziyade avantaj sağlayabileceğim daha fazla OOP benzeri bir şey var mı?

Nesne A daima B.

DÜZENLEMEYİ Nesne kendini dönüştürmek için bilmeli: Bir yan not olarak, gerçek dünyada, Nesne A ve Nesne hem de B Varlık Çerçeve 4 varlıklardır. Bir "Beklemede Ürün" almak, yeni bir Ürün varlığına dönüştürmek, veri içeriğine eklemek ve kaydetmek istiyorum.

cevap

18

Bunun yapılabilmesi için çeşitli yollar vardır, ancak eşleme kodunu kendiniz yazıp yansıtma yoluyla ele alma veya AutoMapper gibi önceden oluşturulmuş bir çerçeveye güvenme konusunda gerçekten kaynadılar. Benzer bir soruya başka bir SO soruyla cevap verdim here.

Ben referans için buradan ekleyeceğiz: Gerçekçi

yapabildin

1.Reflection

public void Map<TSource, TDestination>(TSource source, TDestination destination) 
{ 
    var props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    var type = typeof(TDestination); 

    foreach (var prop in props) 
    { 
    object value = prop.GetValue(source, null); 

    var prop2 = type.GetProperty(prop.Name); 
    if (prop2 == null) 
     continue; 

    if (prop.PropertyType != prop2.PropertyType) 
     continue; 

    prop2.SetValue(destination, value, null); 
    } 
} 

2.Kopya Oluşturucu

public Employee(Person person) 
{ 
    // Copy properties 
} 

3.Implicit/Açık Dönüşüm

public static implicit operator Employee(Person person) 
{ 
    // Build instance and return 
} 

4.AutoMapper

Mapper.Map<Person, Employee>(person); 

5.Combination 3/4: Örtülü/açık dönüşüm operatörleri

public static implicit operator Employee(Person person) 
{ 
    return Mapper.Map<Person, Employee>(person); 
} 

bir not: Eğer elde etmezsiniz kullanılmasında inanıyorum CLS uyumlu kod.

AutoMapper sen ör .:

Mapper.CreateMap<Person, Employee>() 
     .ForMember(e => e.Forename, o => o.MapFrom(p => p.Forename.ToLower())); 
0

Eğer Üründen PendingProduct türetmek istemem, üzerinde eşleştirilir kadar farklı özellikler hedef türüne özelleştirmek için izin veriyor?

public class Product 
{  
    public string Name { get; set; }  
    public string Description { get; set; }  
    public ProductColors Colors { get; set; } 
} 

public class PendingProduct : Product 
{   
    public int ColorCount { get; set; } 
} 
İlgili konular