@@ -46,12 +46,22 @@ public SimpleRecord(IDictionary<string, object> data, string tableName, DataStra
4646
4747 public override bool TryGetMember ( GetMemberBinder binder , out object result )
4848 {
49- if ( _data . ContainsKey ( binder . Name ) )
49+ if ( TryGetMember ( binder . Name , out result ) == false )
5050 {
51- result = _data [ binder . Name ] ;
51+ return base . TryGetMember ( binder , out result ) ;
52+ }
53+
54+ return true ;
55+ }
56+
57+ private bool TryGetMember ( string name , out object result )
58+ {
59+ if ( _data . ContainsKey ( name ) )
60+ {
61+ result = _data [ name ] ;
5262 var converted = ConvertResult ( result ) ;
5363 if ( ! ReferenceEquals ( result , converted ) )
54- _data [ binder . Name ] = result = converted ;
64+ _data [ name ] = result = converted ;
5565
5666 return true ;
5767 }
@@ -67,9 +77,9 @@ public override bool TryGetMember(GetMemberBinder binder, out object result)
6777 try
6878 {
6979 var relatedAdapter = _database . GetAdapter ( ) as IAdapterWithRelation ;
70- if ( relatedAdapter != null && relatedAdapter . IsValidRelation ( _tableName , binder . Name ) )
80+ if ( relatedAdapter != null && relatedAdapter . IsValidRelation ( _tableName , name ) )
7181 {
72- result = GetRelatedData ( binder , relatedAdapter ) ;
82+ result = GetRelatedData ( name , relatedAdapter ) ;
7383 return true ;
7484 }
7585 }
@@ -78,13 +88,15 @@ public override bool TryGetMember(GetMemberBinder binder, out object result)
7888 throw new UnresolvableObjectException ( e . ObjectName , string . Format ( "Column '{0}' not found." , e . ObjectName ) , e ) ;
7989 }
8090 }
81- return base . TryGetMember ( binder , out result ) ;
91+
92+ result = null ;
93+ return false ;
8294 }
8395
84- private object GetRelatedData ( GetMemberBinder binder , IAdapterWithRelation relatedAdapter )
96+ private object GetRelatedData ( string name , IAdapterWithRelation relatedAdapter )
8597 {
8698 object result ;
87- var related = relatedAdapter . FindRelated ( _tableName , _data , binder . Name ) ;
99+ var related = relatedAdapter . FindRelated ( _tableName , _data , name ) ;
88100 var query = related as SimpleQuery ;
89101 if ( query != null )
90102 {
@@ -94,10 +106,10 @@ private object GetRelatedData(GetMemberBinder binder, IAdapterWithRelation relat
94106 else
95107 {
96108 result = related is IDictionary < string , object >
97- ? ( object ) new SimpleRecord ( related as IDictionary < string , object > , binder . Name , _database )
109+ ? ( object ) new SimpleRecord ( related as IDictionary < string , object > , name , _database )
98110 : ( ( IEnumerable < IDictionary < string , object > > ) related ) . Select (
99- dict => new SimpleRecord ( dict , binder . Name , _database ) ) . ToList < dynamic > ( ) ;
100- _data [ binder . Name ] = result ;
111+ dict => new SimpleRecord ( dict , name , _database ) ) . ToList < dynamic > ( ) ;
112+ _data [ name ] = result ;
101113
102114 }
103115 return result ;
@@ -115,6 +127,19 @@ public override bool TryConvert(ConvertBinder binder, out object result)
115127 return result != null ;
116128 }
117129
130+ public override bool TryGetIndex ( GetIndexBinder binder , object [ ] indexes , out object result )
131+ {
132+ if ( indexes . Length == 1 && indexes [ 0 ] is string )
133+ {
134+ if ( TryGetMember ( ( string ) indexes [ 0 ] , out result ) )
135+ {
136+ return true ;
137+ }
138+ }
139+
140+ return base . TryGetIndex ( binder , indexes , out result ) ;
141+ }
142+
118143 public override IEnumerable < string > GetDynamicMemberNames ( )
119144 {
120145 return _data . Keys . AsEnumerable ( ) ;
0 commit comments