2010-02-03 20 views
1

Remarque: cette question est désormais obsolète et ne s'applique qu'aux anciennes versions d'AutoMapper. Le bug mentionné ici a été corrigé.Les convertisseurs AutoMapper échouent pour les valeurs nulles


Problème:

J'ai un convertisseur AutoMapper qui prend un Nullable<bool>/bool? et retourne un string. Je l'applique globalement à mon profil, et cela fonctionne pour true et false mais pas pour null.

Voici ce que j'ai dans mon profil AutoMapper:

CreateMap<bool?, string>() 
    .ConvertUsing<NullableBoolToLabel>(); 

Et voici la classe convertisseur:

public class NullableBoolToLabel : ITypeConverter<bool?, string> 
{ 
    public string Convert(bool? source) 
    { 
     if (source.HasValue) 
     { 
      if (source.Value) 
       return "Yes"; 
      else 
       return "No"; 
     } 
     else 
      return "(n/a)"; 
    } 
} 

exemple qui illustre problème

public class Foo 
{ 
    public bool? IsFooBarred { get; set; } 
} 

public class FooViewModel 
{ 
    public string IsFooBarred { get; set; } 
} 

public class TryIt 
{ 
    public TryIt() 
    { 
     Mapper.CreateMap<bool?, string>().ConvertUsing<NullableBoolToLabel>(); 
     Mapper.CreateMap<Foo, FooViewModel>(); 

     // true (succeeds) 
     var foo1 = new Foo { IsFooBarred = true }; 
     var fooViewModel1 = Mapper.Map<Foo, FooViewModel>(foo1); 
     Debug.Print("[{0}]", fooViewModel1.IsFooBarred); // prints: [Yes] 

     // false (succeeds) 
     var foo2 = new Foo { IsFooBarred = false }; 
     var fooViewModel2 = Mapper.Map<Foo, FooViewModel>(foo2); 
     Debug.Print("[{0}]", fooViewModel2.IsFooBarred); // prints: [No] 

     // null (fails) 
     var foo3 = new Foo { IsFooBarred = null }; 
     var fooViewModel3 = Mapper.Map<Foo, FooViewModel>(foo3); 
     Debug.Print("[{0}]", fooViewModel3.IsFooBarred); // prints: [] 
                // should print: [(n/a)] 
    } 
} 

Questions:

  1. Est-ce un bug ou par la conception?
  2. Si c'est par conception, quel est le raisonnement qui sous-tend ce fonctionnement?
  3. Pouvez-vous recommander une solution de contournement?
+1

Non, c'est un bug, et je le chasse en tapant ceci. –

Répondre

0

Cela a été un bug dans AutoMapper et a depuis été corrigé.

L'interface ITypeConverter a également changé depuis que cette question a été posée. Le convertisseur devrait maintenant ressembler à ceci:

public class NullableBoolToLabel : ITypeConverter<bool?, string> 
{ 
    public string Convert(ResolutionContext context) 
    { 
     var source = (bool?)context.SourceValue; 
     if (source.HasValue) 
     { 
      if (source.Value) 
       return "Yes"; 
      else 
       return "No"; 
     } 
     else 
      return "(n/a)"; 
    } 
} 
0

Avez-vous besoin de spécifier une conversion pour la carte? Sinon, je ne sais pas comment il pourrait utiliser le membre IsFooBarred de la classe Foo. Mais je ne suis pas familier avec le Mapper, et peut-être qu'il peut comprendre cela (il semble dans les deux premiers cas).

Si vous placez un point d'arrêt dans Convertir, est-il touché (dans le débogueur) dans l'un des 3 cas?

+0

C'est en fait une très vieille question. C'était un bug dans AutoMapper qui a été corrigé il y a un moment. Merci pour votre réponse de toute façon :) – devuxer