Поэтому пусть у них будут EmitMappers, а у нас будет ExpressionMapper
Использовать так:
var mapper = Map.GetObjectMapper<Source,Dest>(); // или new ExpressionMapper<Source,Dest>().GetMapper();
var src = new Source();
var dest = mapper(src);
Мапит значения, объекты, списки объектов друг в друга с возможностью полного копирования, обратными ссылками и отслеживанем уникальности ссылок.
Параметры DeepCopy и HandleCrossReferences по-умолчанию включены. Так что если не нужно клонирование однотипных объектов и обработка ссылок, то выключать самостоятельно.
Производительность, конечно, процентов на несколько хуже, чем рукописный код, но всякие ЕмитМаперы могут идти тренироваться дальше.