2016-07-05 1 views
0

Je cherche un objet à objet mappeur qui peut effectuer les opérations suivantes:classe à base Converter pour objet à objet Mapper

Étant donné:

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

et

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

Source et Target étant un code tiers intouchable.

Je voudrais être en mesure de fournir une convention (Name-) convertisseur à base classe comme ceci:

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  
} 

Et puis être en mesure de l'utiliser comme ceci:

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); 

Est il y a-t-il une bibliothèque de cartographie .Net qui peut faire cela?
Si oui, quelqu'un peut-il donner un exemple comment le faire?

+0

peut-être AutoMapper? – MistyK

+0

J'ai regardé AutoMapper, mais je n'ai pas trouvé le moyen de le faire. Pouvez-vous fournir un exemple de code? – 3dGrabber

Répondre

1

Voici une façon de le faire avec Automapper. Il utilise simplement l'initialiseur statique de sorte que le mappage soit étendu à l'application, et de toute évidence on mettrait en œuvre un meilleur algorithme d'âge ... Oh, les classes Source et Target ont besoin de propriétés publiques.

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);