private Mapper(Action <MappingInstructions> mapperBuilder) { _mappers = Algorithm.LazyIndexer <MapperKey, Action <object, object> >(key => { var instructions = new MappingInstructions(key.SourceType, key.DestType); mapperBuilder(instructions); return(GenerateMapper(instructions)); }, new MapperKeyEqualityComparer()); }
private static Action <object, object> GenerateMapper(MappingInstructions instructions) { var dm = new DynamicMethod( "Map" + instructions.SourceType.Name + "To" + instructions.SourceType.Name + Interlocked.Increment(ref _nextMapperId), typeof(void), new[] { typeof(object), typeof(object) }, true); var ilGen = dm.GetILGenerator(); foreach (var mapping in instructions.GetMappings()) { mapping.GenerateMap(ilGen, 0, 1); } ilGen.Emit(OpCodes.Ret); return((Action <object, object>)dm.CreateDelegate(typeof(Action <object, object>))); }