Una delle cose fantastiche di un linguaggio fortemente tipizzato e compilato sono gli errori del compilatore, EmitMapper fa di tutto per complicarvi la vita e rendervi facile fare errori banali che scoprite solo a runtime:
image
supponendo di voler mappare un modello come quello esposto avete bisogno di spiegare al mapper che la proprietà “Name” deve essere mappata su “FullName” del tipo di destinazione. EmitMapper offre questa funzionalità attraverso il metodo MatchMembers esposto dal motore di configurazione:
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<SourceClass, DestinationClass>
(
new MappingConfiguration()
.MatchMembers( ( s, d ) =>
{
if( s == "Name" && d == "FullName" )
{
return true;
}

return s == d;
})
);
metodo decisamente prolisso e prono ad errori perché usa le stringhe per identificare le proprietà, ergo non siete molto refactoring-friendly. Perché quindi non esprimere la stessa cosa così:
var mapper = ObjectMapperManager.DefaultInstance.GetMapper<SourceClass, DestinationClass>
(
new MappingConfiguration()
.MatchMembers<SourceClass, DestinationClass>( m  =>
{
m.Match( s => s.Name, d => d.FullName );
} )
);
Sfruttiamo l’espressività delle Lambda Expression per definire il match tra le proprietà, internamente poi non facciamo altro che rimappare il tutto sul metodo esposto da EmitMapper, semplice, potente, intuitivo, refactoring-friendly e con il supporto per l’intellisense il che non fa schifo proprio a nessuno credo… Smile
.m