2017-07-21 2 views
1

Je voudrais créer un convertisseur de type générique qui convertit un Guid en une chaîne et une chaîne en un Guid selon la direction que je convertis (DTO> VM ou VM> DTO). De plus, certaines propriétés ont des Guids nullables, donc j'ai pensé que je pourrais gérer cela aussi. Je l'ai essayé ce qui suit avec pas de chance:Automapper Chaîne à Guid ne fonctionne pas

CreateMap<string, Guid?>().ConvertUsing(value => !string.IsNullOrEmpty(value) ? Guid.Parse(value) : (Guid?)null); 
CreateMap<string, Guid>().ConvertUsing(guid => Guid.Parse(guid)); 

et

CreateMap<Guid?, string>().ConvertUsing(guid => guid?.ToString("N")); 
CreateMap<Guid, string>().ConvertUsing(guid => guid.ToString("N")); 

Toutes les suggestions sur la façon dont je peux obtenir ce travail?

+0

Pourquoi n'avez-vous pas de chance avec votre essai? Ne compile pas, quelle erreur? Ne fonctionne pas à l'exécution, quelle exception? – fharreau

+0

Quelle version d'automapper utilisez-vous? Un problème est survenu il y a un certain temps: https://github.com/AutoMapper/AutoMapper/issues/523 – jProg2015

+0

Utilisation de v6.1.1. Pas d'erreur renvoyée par automapper. Je viens d'obtenir une référence null sur la propriété car elle ne convertit pas la chaîne en GUID. – 206mph

Répondre

3

Cela fonctionne sur mon ordinateur:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<string, Guid>().ConvertUsing(s => Guid.Parse(s)); 
    cfg.CreateMap<string, Guid?>().ConvertUsing(s => String.IsNullOrWhiteSpace(s) ? (Guid?)null : Guid.Parse(s)); 
    cfg.CreateMap<Guid?, string>().ConvertUsing(g => g?.ToString("N")); 
    cfg.CreateMap<Guid, string>().ConvertUsing(g => g.ToString("N")); 
}); 

var guid = Guid.NewGuid(); 
var guidStr = Guid.NewGuid().ToString(); 

var guid1 = Mapper.Map<Guid>(guidStr);  // The guid is parsed successfully 
var guid2 = Mapper.Map<Guid?>(null);  // Gets null as expected 
var str1 = Mapper.Map<string>(guid);  // The guid is serialized successfully 
var str2 = Mapper.Map<string>(null);  // Gets null as expected 

-vous configurer votre Mapper comme celui-ci, en utilisant la méthode Initialize?

Il fonctionne également en utilisant les méthodes Mapper.Instance.Map au lieu de Mapper.Map directement.

0

Si le format de chaîne par défaut est suffisant, cela fonctionne par défaut dans les deux sens, aucun convertisseur de type requis.