22using System . Collections . Generic ;
33using System . Data ;
44using System . Linq ;
5+ using System . Reflection ;
56using Shuttle . Core . Contract ;
67
78namespace Shuttle . Core . Data
89{
910 public class DataRowMapper : IDataRowMapper
1011 {
12+ private readonly object _lock = new object ( ) ;
13+ private readonly Dictionary < Type , PropertyInfo [ ] > _properties = new Dictionary < Type , PropertyInfo [ ] > ( ) ;
14+
1115 public MappedRow < T > MapRow < T > ( DataRow row ) where T : new ( )
1216 {
1317 Guard . AgainstNull ( row , nameof ( row ) ) ;
1418
15- return new MappedRow < T > ( row , Map < T > ( row ) ) ;
19+ return new MappedRow < T > ( row , Map < T > ( GetPropertyInfo < T > ( ) , row ) ) ;
1620 }
1721
1822 public IEnumerable < MappedRow < T > > MapRows < T > ( IEnumerable < DataRow > rows ) where T : new ( )
1923 {
20- return rows ? . Select ( row => new MappedRow < T > ( row , Map < T > ( row ) ) ) . ToList ( ) ?? new List < MappedRow < T > > ( ) ;
24+ var properties = GetPropertyInfo < T > ( ) ;
25+
26+ return rows ? . Select ( row => new MappedRow < T > ( row , Map < T > ( properties , row ) ) ) . ToList ( ) ??
27+ new List < MappedRow < T > > ( ) ;
2128 }
2229
2330 public T MapObject < T > ( DataRow row ) where T : new ( )
2431 {
25- return Map < T > ( row ) ;
32+ return Map < T > ( GetPropertyInfo < T > ( ) , row ) ;
2633 }
2734
2835 public IEnumerable < T > MapObjects < T > ( IEnumerable < DataRow > rows ) where T : new ( )
2936 {
30- return rows ? . Select ( Map < T > ) . ToList ( ) ?? new List < T > ( ) ;
37+ var properties = GetPropertyInfo < T > ( ) ;
38+
39+ return rows ? . Select ( row => Map < T > ( properties , row ) ) . ToList ( ) ?? new List < T > ( ) ;
3140 }
3241
3342 public T MapValue < T > ( DataRow row )
@@ -40,17 +49,31 @@ public IEnumerable<T> MapValues<T>(IEnumerable<DataRow> rows)
4049 return rows ? . Select ( MapRowValue < T > ) . ToList ( ) ?? new List < T > ( ) ;
4150 }
4251
43- private T Map < T > ( DataRow row ) where T : new ( )
52+ private PropertyInfo [ ] GetPropertyInfo < T > ( )
53+ {
54+ lock ( _lock )
55+ {
56+ var type = typeof ( T ) ;
57+
58+ if ( ! _properties . ContainsKey ( type ) )
59+ {
60+ _properties . Add ( type , type . GetProperties ( ) ) ;
61+ }
62+
63+ return _properties [ type ] ;
64+ }
65+ }
66+
67+ private T Map < T > ( PropertyInfo [ ] properties , DataRow row ) where T : new ( )
4468 {
4569 if ( row == null )
4670 {
4771 return default ( T ) ;
4872 }
4973
5074 var result = new T ( ) ;
51- var type = typeof ( T ) ;
5275
53- foreach ( var pi in type . GetProperties ( ) )
76+ foreach ( var pi in properties )
5477 {
5578 try
5679 {
@@ -78,7 +101,7 @@ private static T MapRowValue<T>(DataRow row)
78101
79102 return row ? [ 0 ] == null
80103 ? default ( T )
81- : ( T ) Convert . ChangeType ( row [ 0 ] , underlyingSystemType ) ;
104+ : ( T ) Convert . ChangeType ( row [ 0 ] , underlyingSystemType ) ;
82105 }
83106 }
84107}
0 commit comments