Skip to content

Commit 7255cbe

Browse files
committed
Merge branch 'master' into develop
2 parents 4bd480e + 49f7da5 commit 7255cbe

File tree

3 files changed

+521
-3
lines changed

3 files changed

+521
-3
lines changed

Quick.AutoMapper.pas

+26-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,20 @@ TMapper<T : class, constructor> = class
118118
{$ENDIF}
119119
end;
120120

121-
TAutoMapper<TClass1, TClass2 : class, constructor> = class
121+
IAutoMapper<TClass1, TClass2 : class, constructor> = interface['{9F7B2DEA-76D8-4DD1-95D0-22C22AEB5DD0}']
122+
function Map(aSrcObj : TClass1) : TClass2; overload;
123+
{$IFNDEF FPC}
124+
function Map(aSrcObj : TClass2) : TClass1; overload;
125+
procedure SetOnDoMapping(CustomProc : TMappingProc<TClass1>);
126+
procedure SetOnAfterMapping(CustomProc : TAfterMappingProc<TClass1,TClass2>);
127+
{$ELSE}
128+
//freepascal detects overload with generic types as duplicated function, added dummy field to avoid this
129+
function Map(aSrcObj : TClass2; dummy : Boolean = True) : TClass1; overload;
130+
{$ENDIF}
131+
end;
132+
133+
134+
TAutoMapper<TClass1, TClass2 : class, constructor> = class(TInterfacedObject, IAutoMapper<TClass1, TClass2>)
122135
private
123136
fCustomMapping : TCustomMapping;
124137
{$IFNDEF FPC}
@@ -140,6 +153,8 @@ TAutoMapper<TClass1, TClass2 : class, constructor> = class
140153
function Map(aSrcObj : TClass1) : TClass2; overload;
141154
{$IFNDEF FPC}
142155
function Map(aSrcObj : TClass2) : TClass1; overload;
156+
procedure SetOnDoMapping(CustomProc : TMappingProc<TClass1>);
157+
procedure SetOnAfterMapping(CustomProc : TAfterMappingProc<TClass1,TClass2>);
143158
{$ELSE}
144159
//freepascal detects overload with generic types as duplicated function, added dummy field to avoid this
145160
function Map(aSrcObj : TClass2; dummy : Boolean = True) : TClass1; overload;
@@ -366,6 +381,16 @@ function TAutoMapper<TClass1, TClass2>.Map(aSrcObj: TClass2): TClass1;
366381
begin
367382
Result := TMapper<TClass1>.Map<TClass1>(aSrcObj,fOnDoMapping,fCustomMapping);
368383
end;
384+
procedure TAutoMapper<TClass1, TClass2>.SetOnAfterMapping(CustomProc: TAfterMappingProc<TClass1, TClass2>);
385+
begin
386+
fOnAfterMapping := CustomProc;
387+
end;
388+
389+
procedure TAutoMapper<TClass1, TClass2>.SetOnDoMapping(CustomProc: TMappingProc<TClass1>);
390+
begin
391+
fOnDoMapping := CustomProc;
392+
end;
393+
369394
{$ELSE}
370395
function TAutoMapper<TClass1, TClass2>.Map(aSrcObj: TClass2; dummy : Boolean = True): TClass1;
371396
begin

samples/delphi/QuickAutoMapper/AutoMappingObjects.dpr

+48-1
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,13 @@ type
109109
var
110110
User : TUser;
111111
User2 : TUser2;
112+
User3 : TUser2;
112113
job : TJob;
113114
AutoMapper : TAutoMapper<TUser,TUser2>;
115+
{$IFNDEF FPC}
116+
InterfacedAutoMapper : IAutoMapper<TUser,TUser2>;
117+
{$ENDIF}
118+
114119

115120
{ TUser }
116121

@@ -221,7 +226,30 @@ begin
221226
//User2 := TUser2(User.Clone);
222227
//User2 := TMapper<TUserBase>.Clone(User) as TUser2;
223228

224-
cout('COMPARE USER VS USER2',etTrace);
229+
{$IFNDEF FPC}
230+
InterfacedAutoMapper := TAutoMapper<TUser,TUser2>.Create;
231+
232+
InterfacedAutoMapper.SetOnDoMapping(
233+
procedure(const aSrcObj : TUser; const aTargetName : string; out Value : TFlexValue)
234+
begin
235+
if aTargetName = 'Money' then Value := aSrcObj.Cash * 2
236+
else if aTargetName = 'IdUser' then Value := aSrcObj.Id;
237+
end
238+
);
239+
240+
InterfacedAutoMapper.SetOnAfterMapping(
241+
procedure(const aSrcObj : TUser; aTgtObj : TUser2)
242+
begin
243+
aTgtObj.Money := aSrcObj.Cash * 2;
244+
aTgtObj.IdUser := aSrcObj.Id;
245+
end
246+
);
247+
248+
user3 := InterfacedAutoMapper.Map(User);
249+
250+
{$ENDIF}
251+
252+
cout('COMPARE Instanced Mapper USER VS USER2',etTrace);
225253
cout('User.Id = %d / User2.IdUser = %d',[User.Id,User2.IdUser],etInfo);
226254
cout('User.CreationDate = %s / User2.CreationDate = %s',[DateTimeToStr(User.CreationDate),DateTimetoStr(User2.CreationDate)],etInfo);
227255
cout('User.Name = %s / User2.Name = %s',[User.Name,User2.Name],etInfo);
@@ -232,12 +260,31 @@ begin
232260
cout('User.Job.DateFrom = %s / User2.Job.DateFrom = %s',[DateTimeToStr(User.Job.DateFrom),DateTimeToStr(User2.Job.DateFrom)],etInfo);
233261
cout('User.Car.Model = %s / User2.Car.Model = %s',[User.Car.Model,User2.Car.Model],etInfo);
234262

263+
{$IFNDEF FPC}
264+
cout('COMPARE Interfaced Mapper USER VS USER3',etTrace);
265+
cout('User.Id = %d / User3.IdUser = %d',[User.Id,User3.IdUser],etInfo);
266+
cout('User.CreationDate = %s / User3.CreationDate = %s',[DateTimeToStr(User.CreationDate),DateTimetoStr(User3.CreationDate)],etInfo);
267+
cout('User.Name = %s / User3.Name = %s',[User.Name,User3.Name],etInfo);
268+
cout('User.Age = %d / User3.Age = %d',[User.Age,User3.Age],etInfo);
269+
cout('User.Numbers = %d / User3.Numbers = %d',[User.Numbers[1],User3.Numbers[1]],etInfo);
270+
cout('User.Cash = %d / User3.Money = %d',[User.Cash,User3.Money],etInfo);
271+
cout('User.Job.Name = %s / User3.Job.Name = %s',[User.Job.Name,User3.Job.Name],etInfo);
272+
cout('User.Job.DateFrom = %s / User3.Job.DateFrom = %s',[DateTimeToStr(User.Job.DateFrom),DateTimeToStr(User3.Job.DateFrom)],etInfo);
273+
cout('User.Car.Model = %s / User3.Car.Model = %s',[User.Car.Model,User3.Car.Model],etInfo);
274+
275+
{$ENDIF}
276+
235277
cout(' ',etInfo);
236278
cout('USER AS JSON RESULT',etTrace);
237279
cout('%s',[User.ToJson],etInfo);
238280
cout(' ',etInfo);
239281
cout('USER2 AS JSON RESULT',etTrace);
240282
cout('%s',[User2.ToJson],etInfo);
283+
{$IFNDEF FPC}
284+
cout(' ',etInfo);
285+
cout('USER3 AS JSON RESULT',etTrace);
286+
cout('%s',[User3.ToJson],etInfo);
287+
{$ENDIF}
241288

242289
finally
243290
AutoMapper.Free;

0 commit comments

Comments
 (0)