Skip to content

Commit 65ff01e

Browse files
committed
Merge pull request ThatRendle#327 from jplane/master
added support for dynamic indexer getter to SimpleRecord
2 parents fc246cc + 3606811 commit 65ff01e

File tree

2 files changed

+47
-11
lines changed

2 files changed

+47
-11
lines changed

Simple.Data.UnitTest/DynamicRecordTest.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ public void DynamicRecordSetterTest()
4141
Assert.AreEqual("Bob", target.Name);
4242
}
4343

44+
/// <summary>
45+
///A test for DynamicRecord Constructor
46+
///</summary>
47+
[Test()]
48+
public void DynamicRecordIndexerTest()
49+
{
50+
dynamic target = new SimpleRecord();
51+
target.Name = "Bob";
52+
Assert.AreEqual("Bob", target["Name"]);
53+
}
54+
4455
[Test]
4556
public void DynamicCastTest()
4657
{

Simple.Data/SimpleRecord.cs

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)