2010-11-02 3 views
2

Je suis en train de travailler sur la façon de remplir Foo de FooConfig:Automapper: Ignorer correspondance exacte et Ressemblance postfix à la place

class Bar 
{ 
    int A; 
    int B; 
} 

class Foo 
{ 
    Bar BarValues; 
    Bar BarErrorValues; 
} 

class FooConfig 
{ 
    int A; 
    int B; 
    int AError; 
    int BError; 
} 

FooConfig est essentiellement une version aplatie de Foo.

Je peux remplir la BarValues facilement avec AutoMapper (en ayant une carte définie pour FooConfig-Bar), mais je ne parviens pas à obtenir le BarErrorValues peuplé - tout ce que j'essayer finit avec les valeurs A et B en elle au lieu de les valeurs AError et BError.

Je suppose que je dois utiliser un "transformateur" ou RecognizePostfixes (bien que cela ne semble pas fonctionner comme je l'ai essayé).

Répondre

0

Je pense avoir trouvé le problème. Il semble que si AutoMapper trouve une correspondance exacte, le nom de transformateur n'est jamais utilisé. Bugger :(Voici le code source AutoMapper qui le montre:

private static MemberInfo FindTypeMember(IEnumerable<MemberInfo> modelProperties, IEnumerable<MethodInfo> getMethods, string nameToSearch, IMappingOptions mappingOptions) 
{ 
    MemberInfo pi = modelProperties.FirstOrDefault(prop => NameMatches(prop.Name, nameToSearch)); 
    if (pi != null) 
     return pi; 

    ... 

    pi = modelProperties.FirstOrDefault(prop => NameMatches(mappingOptions.SourceMemberNameTransformer(prop.Name), nameToSearch)); 
    if (pi != null) 
     return pi; 
1

Cela devrait fonctionner "hors de la boîte".

Mapper.CreateMap<FooConfig, Foo>() 
    .ForMember(d => d.BarValues, o => o.MapFrom(s => new Bar { A = s.A, B = s.B })) 
    .ForMember(d => d.BarErrorValues, o => o.MapFrom(s => new Bar {A = s.AError, B = s.BError})); 
+0

Salut Patrick J'essaie d'éviter d'écrire ForMember pour chaque membre (J'ai plus de 50 ans en réalité.) La façon dont je le vois si je vais le faire alors je pourrais écrire une fonction manuelle X = Y – Schneider

Questions connexes