@@ -331,7 +331,7 @@ public virtual void WriteRecord<T>(T record)
331331 {
332332 try
333333 {
334- recordManager . Value . Write ( record ) ;
334+ recordManager . Value . GetWriterAction < T > ( GetTypeInfoForRecord ( record ) ) ( record ) ;
335335 }
336336 catch ( TargetInvocationException ex )
337337 {
@@ -362,6 +362,9 @@ public virtual void WriteRecords(IEnumerable records)
362362 NextRecord ( ) ;
363363 }
364364
365+ Action < object > writerAction = null ;
366+ RecordTypeInfo writerActionType = default ;
367+
365368 foreach ( var record in records )
366369 {
367370 if ( record == null )
@@ -371,7 +374,13 @@ public virtual void WriteRecords(IEnumerable records)
371374 continue ;
372375 }
373376
374- WriteRecord ( record ) ;
377+ if ( writerAction == null || writerActionType . RecordType != record . GetType ( ) )
378+ {
379+ writerActionType = GetTypeInfoForRecord ( record ) ;
380+ writerAction = recordManager . Value . GetWriterAction < object > ( writerActionType ) ;
381+ }
382+
383+ writerAction ( record ) ;
375384 NextRecord ( ) ;
376385 }
377386 }
@@ -393,9 +402,18 @@ public virtual void WriteRecords<T>(IEnumerable<T> records)
393402 NextRecord ( ) ;
394403 }
395404
405+ Action < T > writerAction = null ;
406+ RecordTypeInfo writerActionType = default ;
407+
396408 foreach ( var record in records )
397409 {
398- WriteRecord ( record ) ;
410+ if ( writerAction == null || ( record != null && writerActionType . RecordType != record . GetType ( ) ) )
411+ {
412+ writerActionType = GetTypeInfoForRecord ( record ) ;
413+ writerAction = recordManager . Value . GetWriterAction < T > ( writerActionType ) ;
414+ }
415+
416+ writerAction ( record ) ;
399417 NextRecord ( ) ;
400418 }
401419 }
@@ -420,11 +438,20 @@ public virtual async Task WriteRecordsAsync(IEnumerable records, CancellationTok
420438 await NextRecordAsync ( ) . ConfigureAwait ( false ) ;
421439 }
422440
441+ Action < object > writerAction = null ;
442+ RecordTypeInfo writerActionType = default ;
443+
423444 foreach ( var record in records )
424445 {
425446 cancellationToken . ThrowIfCancellationRequested ( ) ;
426447
427- WriteRecord ( record ) ;
448+ if ( writerAction == null || ( record != null && writerActionType . RecordType != record . GetType ( ) ) )
449+ {
450+ writerActionType = GetTypeInfoForRecord ( record ) ;
451+ writerAction = recordManager . Value . GetWriterAction < object > ( writerActionType ) ;
452+ }
453+
454+ writerAction ( record ) ;
428455 await NextRecordAsync ( ) . ConfigureAwait ( false ) ;
429456 }
430457 }
@@ -449,11 +476,20 @@ public virtual async Task WriteRecordsAsync<T>(IEnumerable<T> records, Cancellat
449476 await NextRecordAsync ( ) . ConfigureAwait ( false ) ;
450477 }
451478
479+ Action < T > writerAction = null ;
480+ RecordTypeInfo writerActionType = default ;
481+
452482 foreach ( var record in records )
453483 {
454484 cancellationToken . ThrowIfCancellationRequested ( ) ;
455485
456- WriteRecord ( record ) ;
486+ if ( writerAction == null || ( record != null && writerActionType . RecordType != record . GetType ( ) ) )
487+ {
488+ writerActionType = GetTypeInfoForRecord ( record ) ;
489+ writerAction = recordManager . Value . GetWriterAction < T > ( writerActionType ) ;
490+ }
491+
492+ writerAction ( record ) ;
457493 await NextRecordAsync ( ) . ConfigureAwait ( false ) ;
458494 }
459495 }
@@ -478,11 +514,20 @@ public virtual async Task WriteRecordsAsync<T>(IAsyncEnumerable<T> records, Canc
478514 await NextRecordAsync ( ) . ConfigureAwait ( false ) ;
479515 }
480516
517+ Action < T > writerAction = null ;
518+ RecordTypeInfo writerActionType = default ;
519+
481520 await foreach ( var record in records . ConfigureAwait ( false ) )
482521 {
483522 cancellationToken . ThrowIfCancellationRequested ( ) ;
484523
485- WriteRecord ( record ) ;
524+ if ( writerAction == null || ( record != null && writerActionType . RecordType != record . GetType ( ) ) )
525+ {
526+ writerActionType = GetTypeInfoForRecord ( record ) ;
527+ writerAction = recordManager . Value . GetWriterAction < T > ( writerActionType ) ;
528+ }
529+
530+ writerAction ( record ) ;
486531 await NextRecordAsync ( ) . ConfigureAwait ( false ) ;
487532 }
488533 }
@@ -576,15 +621,15 @@ public virtual bool CanWrite(MemberMap memberMap)
576621 /// <typeparam name="T">The type of the record.</typeparam>
577622 /// <param name="record">The record to determine the type of.</param>
578623 /// <returns>The System.Type for the record.</returns>
579- public virtual Type GetTypeForRecord < T > ( T record )
624+ public virtual RecordTypeInfo GetTypeInfoForRecord < T > ( T record )
580625 {
581626 var type = typeof ( T ) ;
582627 if ( type == typeof ( object ) )
583628 {
584- type = record . GetType ( ) ;
629+ return new RecordTypeInfo ( record . GetType ( ) , true ) ;
585630 }
586631
587- return type ;
632+ return new RecordTypeInfo ( type , false ) ;
588633 }
589634
590635 /// <summary>
0 commit comments