2011-01-14 12 views
8

So konvertieren Ich habe zwei benutzerdefinierte komplexe Typen wie folgt aus (in diesem Beispiel stark vereinfacht):Wie eine benutzerdefinierte komplexe Typ in einen anderen benutzerdefinierten komplexen Typ

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

Sagen wir, ich dieses Objekt muss wissen, wie sich zu konvertieren auf eine andere Art: So

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

, wenn ich eine Methode aufrufen PendingProduct zu Produkt umzuwandeln, werde ich einige benutzerdefinierte Logik ausführen, die „Colorcount“ Anzahl der ProductColor Objekte auf die Produktklasse hinzufügt. Das ist völlig vereinfacht, aber die Architektur der Klasse ist hier wirklich irrelevant.

Was meine Hauptfrage ist, ist dies:

Was ist die beste Praxis-Methode zu verwenden, um die Umwandlung eines komplexen Typs in einem anderen komplexen Typ zu implementieren, wenn die Eigenschaften der Objekte unterscheiden?

In der realen Welt sind die Eigenschaften sehr unterschiedlich, und ich werde einige benutzerdefinierte Logik zur Karte schreiben, was ich von Objekt A benötigen B. schreiben konnte ich

Offensichtlich Objekt nur eine Funktion, die einen Eingabeparameter von Objekt A und gibt Objekt B zurück, aber ich suche nach einer "Best Practice" -Methode. Kommt IConvertible hier ins Spiel? Gibt es etwas mehr OOP-ähnliches, das ich nutzen kann, anstatt nur eine Funktion zu schreiben, um das zu tun, was ich will?

Objekt A soll immer wissen, wie sie konvertieren B.

EDIT Objekt Als Randnotiz, in der realen Welt, Objekt A und Objekt B sind beide Entity Framework 4 Einheiten. Ich möchte ein "Pending Product" nehmen, es in eine neue Product-Entity umwandeln, es an den Datenkontext anhängen und speichern.

Antwort

18

Es gibt zahlreiche Möglichkeiten dies zu tun, aber sie können entweder den Mapping-Code selbst schreiben, ihn durch Reflektion behandeln oder auf ein vorgefertigtes Framework wie AutoMapper zurückgreifen. Ich habe eine ähnliche Frage in einer anderen SO Frage here beantwortet.

Ich werde es fügen hier für Ihre Referenz:

Realistisch betrachtet man konnte

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.Kopie Constructor

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

3.Implicit/Explizite Konvertierung

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

4.AutoMapper

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

5.Combination von 3/4:

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

Ein Hinweis auf implizite/explizite Konvertierung Betreiber: Ich glaube, diese sich mit der Sie nicht erzeugen, werden CLS-konformer Code

AutoMapper ermöglicht es Ihnen, wie verschiedene Eigenschaften auf dem Zieltyp anpassen abgebildet über, z.B .:

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

Würden Sie nicht PendingProduct von Produkt ableiten wollen?

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; } 
} 
Verwandte Themen