2011-01-14 12 views
8

Więc mam dwa niestandardowe typy złożone tak (uproszczony dla tego przykładu):Jak przekonwertować niestandardowy typ złożony do innego niestandardowego typu złożonego

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

Powiedzmy, że trzeba ten obiekt wiedzieć, jak przekształcić się do innego rodzaju:

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

Więc gdy zgłoszę metodę konwersji PendingProduct do produktu, będę wykonywać jakąś niestandardową logikę, która dodaje „ColorCount” liczba ProductColor obiektów do klasy produktu. Jest to całkowicie uproszczone, ale architektura klasy jest tutaj naprawdę nieistotna.

Co moje główne pytanie brzmi, czy to jest:

Jaka jest metoda najlepsza praktyka wykorzystać do realizacji konwersji jednego typu złożonego do innego typu złożonego, gdy właściwości obiektów różnią?

W rzeczywistym świecie, właściwości są bardzo różne i będę pisać jakąś niestandardową logikę do mapowania co muszę Address A do obiektu B.

Oczywiście mogę tylko napisać funkcję, która przyjmuje parametr wejściowy obiektu A i zwraca obiekt B, ale szukam bardziej "najlepszej praktyki". Czy IConvertible wchodzi tutaj w grę? Czy jest coś bardziej podobnego do OOP-a, że ​​mogę skorzystać, a nie tylko napisać funkcję, aby zrobić to, co chcę?

Przedmiot A powinien zawsze wiedzieć, jak przekształcić się do obiektu B.

EDIT: Na marginesie, w realnym świecie, obiekt A i B są zarówno obiektu Entity Framework 4 podmioty. Chcę wziąć "Produkt oczekujący", przekształcić go w nowy produkt, dołączyć do kontekstu danych i zapisać.

Odpowiedz

18

Istnieje wiele sposobów, w jakie można to zrobić, ale naprawdę sprowadzają się one do samodzielnego napisania kodu odwzorowania, obsługi go poprzez odbicie lub polegania na wstępnie zbudowanym systemie, takim jak AutoMapper. Odpowiedziałem na podobne pytanie w innym pytaniu dotyczĘ ... cym SO here.

będę je dodać tutaj dla odniesienia:

Realistycznie mogłeś

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.Copy Konstruktor

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

3.Implicit/Jawna konwersja

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

4.AutoMapper

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

5.Combination od 3/4:

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

Uwaga na wyraźnych operatorów ukrytych/konwersja: Wierzę w korzystaniu z nich nie będzie generować Kod zgodny z CLS.

AutoMapper nie pozwalają dostosować sposób odmienne właściwości od rodzaju docelowej są odwzorowywane na, np .:

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

nie chcesz czerpać PendingProduct z produktu?

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; } 
} 
Powiązane problemy