2016-07-05 11 views
0

Ich suche ein Objekt-zu-Objekt-Mapper, die Folgendes tun:Klasse basiert Converter für Object-to-Object Mapper

Gegeben:

class Source 
{ 
    string FirstName; 
    string LastName; 
    DateTime DateOfBirth; 
} 

und

class Target 
{ 
    string FirstName; 
    string FamilyName; 
    string FullName; 
    int Age; 
    bool IsMinor; 
} 

Source und Target als unberührbarer 3rd-Party-Code.

Ich möchte in der Lage sein, eine Konvention zur Verfügung zu stellen (Namens-) basierte Konverter Klasse wie folgt:

class Converter 
{ 
    // field 
    public DateTime CurrentDate; 

    // map LastName to FamilyName 
    string FamilyName(string lastName) => lastName; 

    // map FirstName & LastName to FullName 
    string FullName(string firstName, string lastName) => firstName + " " + lastName; 

    // map DateOfBirth to Age 
    int Age(DateTime dateOfBirth) 
    { 
     var days = (CurrentDate - dateOfBirth).TotalDays; 
     return (int)(days/365.25); 
    } 

    // map DateOfBirth to IsMinor 
    bool IsMinor(DateTime dateOfBirth) => Age(dateOfBirth) < 18; 

    // Note: implicit map from FirstName to FirstName  
} 

Und dann in der Lage sein, es wie folgt zu verwenden:

var converter = new Converter {CurrentDate = DateTime.Now}; 
var mapper = new Mapper<Source,Target>(converter); // any mapping lib available for this? 
var targetObject = mapper.Convert(sourceObject); 

Sind Gibt es dafür irgendwelche .Net Mapping-Bibliotheken?
Wenn ja, kann jemand ein Beispiel geben, wie es geht?

+0

vielleicht AutoMapper? – MistyK

+0

Ich habe AutoMapper angeschaut, konnte aber keinen Weg finden, dies zu tun. Können Sie einen Beispielcode bereitstellen? – 3dGrabber

Antwort

1

hilft, ist eine Möglichkeit, es mit AutoMapper zu tun. Es verwendet nur den statischen Initialisierer, so dass das Mapping anwendungsweit ist, und offensichtlich würde man einen besseren Altersalgorithmus implementieren ... Oh, die Quell- und Zielklassen benötigen öffentliche Eigenschaften.

Func<DateTime, int> AgeFunc = (dob) => (int)(DateTime.Now - dob).TotalDays/365; 
Mapper.Initialize(cfg => 

    cfg.CreateMap<Source, Target>() 
     .ForMember(dest => dest.FamilyName ,m => m.MapFrom(src => src.LastName)) 
     .ForMember(dest => dest.FullName, m => m.MapFrom(src => src.FirstName + " " + src.LastName)) 
     .ForMember(dest => dest.Age, m => m.MapFrom(src => AgeFunc(src.DateOfBirth))) 
     .ForMember(dest => dest.IsMinor, m => m.MapFrom(src => AgeFunc(src.DateOfBirth) < 18)) 
); 

var peter = new Source() {FirstName = "Peter", LastName="Pan", DateOfBirth=DateTime.Now.AddDays(-7) }; 
var captain = new Source() {FirstName = "Captain", LastName="Hook", DateOfBirth=DateTime.Now.AddDays(-20000) }; 

var targetPerter = Mapper.Map<Target>(peter); 
var targetCaptain = Mapper.Map<Target>(captain);