2012-02-17 26 views
17

Estoy tratando de usar Automapper para mapear objetos, el problema es que uno de los objetos que intento asignar tiene un prefijo 'Cust_' delante de todas sus propiedades y el otro no. ¿Hay alguna manera de hacer este mapeo?AutoMapper con el prefijo

Por ejemplo decir que tengo

class A 
{ 
     String FirstName { get; set; } 
     String LastName { get; set; } 
} 

class B 
{ 
     String Cust_FirstName { get; set; } 
     String Cust_LastName { get; set; } 
} 

Obviamente este mapa no funcionará

AutoMapper.Mapper.CreateMap<A, B>(); 
b = AutoMapper.Mapper.Map<A, B>(a); 

Respuesta

22
Mapper.Initialize(cfg => 
{ 
    cfg.RecognizeDestinationPrefixes("Cust_"); 
    cfg.CreateMap<A, B>(); 
}); 

A a = new A() {FirstName = "Cliff", LastName = "Mayson"}; 
B b = Mapper.Map<A, B>(a); 

//b.Cust_FirstName is "Cliff" 
//b.Cust_LastName is "Mayson" 

O, alternativamente:

Mapper.Configuration.RecognizeDestinationPrefixes("Cust_"); 
Mapper.CreateMap<A, B>(); 
... 
B b = Mapper.Map<A, B>(a); 
... 
+2

Saludos ambos métodos funcionan perfectamente. Aunque ambos métodos no parecen ser específicos del mapa real A a B, pero en realidad afectarán a cualquier otra asignación, digamos A a C –

+0

@CliffMayson, pero no creo que esto sea problemático, especialmente en el caso en que tenga múltiples clases objetivo siguiendo la misma convención. En el caso de que realmente necesite tener configuraciones separadas, por ejemplo, donde necesita tener una lógica diferente para mapear las mismas dos clases, siempre puede crear 'MappingEngine' con sus propias configuraciones. HTH. –

0

La documentación tiene un artículo sobre Recognizing pre/postfixes

A veces, sus propiedades de origen/destino tendrán pre/postfixes comunes que hacen que tenga que hacer un montón de asignaciones de miembros personalizados porque los nombres no coinciden. Para hacer frente a esto, se puede reconocer pre/sufijos:

public class Source { 
    public int frmValue { get; set; } 
    public int frmValue2 { get; set; } 
} 
public class Dest { 
    public int Value { get; set; } 
    public int Value2 { get; set; } 
} 
Mapper.Initialize(cfg => { 
    cfg.RecognizePrefix("frm"); 
    cfg.CreateMap<Source, Dest>(); 
}); 

Mapper.AssertConfigurationIsValid(); Por defecto AutoMapper reconoce el prefijo "GET", si es necesario borrar el prefijo:

Mapper.Initialize(cfg => { 
    cfg.ClearPrefixes(); 
    cfg.RecognizePrefixes("tmp"); 
}); 
Cuestiones relacionadas