2015-08-05 3 views
1

J'essaie d'utiliser Open Generics d'Automapper comme décrit dans https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics pour effectuer un mappage entre Utilisateur et Compte.Automapper et Open Generics

public class User 
{ 
    public Guid UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime Dob { get; set; } 
} 

public class Account 
{ 
    public Guid UserId { get; set; } 
    public string FirstName { get; set; } 
} 

J'ai créé la source et la destination

public class Source<T> 
{ 
    public T Value { get; set; } 
} 

public class Destination<T> 
{ 
    public T Value { get; set; } 
} 

Je veux effectuer la mise en correspondance dans un AccountService

public class AccountService 
{ 
    private User user1 = new User{FirstName = "James", LastName = "Jones", Dob = DateTime.Today, UserId = new Guid("AC482E99-1739-46FE-98B8-8758833EB0D2")}; 

    static AccountService() 
    { 
     Mapper.CreateMap(typeof(Source<>), typeof(Destination<>)); 
    } 

    public T GetAccountFromUser<T>() 
    { 
     var source = new Source<User>{ Value = user1 }; 
     var destination = Mapper.Map<Source<User>, Destination<T>>(source); 
     return destination.Value; 
    } 
} 

Mais je reçois une exception

carte de type manquant configuration ou mappage non pris en charge.

types de cartographie: l'utilisateur -> Compte OpenGenerics.Console.Models.User -> OpenGenerics.Console.Models.Account

Chemin de destination: Destination`1.Value.Value

valeur Source: OpenGenerics .Console.Models.User

Je confirme l'approche https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics travaux pour int et double

Modifier Cela peut être une solution pour moi, c'est un peu compliqué.

var mappingExists = Mapper.GetAllTypeMaps().FirstOrDefault(m => m.SourceType == typeof (User) && m.DestinationType == typeof (T)); 
    if (mappingExists == null) 
     Mapper.CreateMap<User, T>(); 

Répondre

1

Pour les génériques fermés, les paramètres de type doivent également pouvoir être mappés. Ajoutez ceci:

Mapper.CreateMap<User, Account>(); 

Et vous êtes prêt.

+0

Espérait que ce n'était pas le cas! Dans ma vraie application, le compte est défini dans le projet MVC et l'utilisateur est défini dans le projet Service. Le projet Service n'a PAS de référence au projet MVC, donc je ne peux pas mapper comme vous le suggérez. Je peux le faire Mapper.CreateMap (); mais ceci est exécuté pour chaque appel à la méthode GetAccountFromUser (). – Bryan

+1

Pouce. Je déteste les mises en page de projets comme celle-ci. Mettez tout simplement dans un projet et utilisez des dossiers. –

+0

Ce bateau a navigué! – Bryan