FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Fixing issue #15 · DIPSAS/Dapper.Oracle@e911201 · GitHub

Repository navigation

Commit e911201

Browse files
Erling Paulsen
committed
Fixing issue #15
1 parent 4f2238e commit e911201

3 files changed

Lines changed: 126 additions & 9 deletions

File tree

‎src/Dapper.Oracle/Expressions/Wrappers.cs‎

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ public ObjectEnumWrapper(string enumType, string propertyName, Type objectType)
2222

2323
protected override Func<TObject, TEnumType> CreateGetter()
2424
{
25-
Type enumType = _objectType.Assembly.GetType($"{_objectType.Namespace}.{_enumType}");
26-
2725
var inputVariable = Expression.Parameter(typeof(TObject));
2826
var converted = Expression.Convert(inputVariable, _objectType);
2927
var retreiver = Expression.Property(converted, _propertyName);
@@ -53,7 +51,6 @@ protected override Action<TObject, TEnumType> CreateSetter()
5351
}
5452
}
5553

56-
5754
public class ObjectWrapper<TObject, TValue>
5855
{
5956
private readonly string _propertyName;
@@ -76,7 +73,6 @@ public void SetValue(TObject command, TValue value)
7673
}
7774

7875
_setter(command, value);
79-
8076
}
8177

8278
public TValue GetValue(TObject obj)
@@ -92,7 +88,8 @@ public TValue GetValue(TObject obj)
9288
protected virtual Func<TObject, TValue> CreateGetter()
9389
{
9490
var inputVariable = Expression.Parameter(typeof(TObject));
95-
var retreiver = Expression.Property(inputVariable, typeof(TObject).GetProperty(_propertyName));
91+
var casted = Expression.Convert(inputVariable, _objectType);
92+
var retreiver = Expression.Property(casted, _objectType.GetProperty(_propertyName));
9693
return Expression.Lambda<Func<TObject, TValue>>(retreiver, inputVariable).Compile();
9794
}
9895

@@ -112,3 +109,72 @@ protected virtual Action<TObject, TValue> CreateSetter()
112109
}
113110
}
114111
}
112+
113+
114+
public class ObjectWrapper<TObject, TValue>
115+
{
116+
private readonly string _propertyName;
117+
private readonly Type _objectType;
118+
119+
private Action<TObject, TValue> _setter;
120+
private Func<TObject, TValue> _getter;
121+
122+
public ObjectWrapper(string propertyName, Type objectType)
123+
{
124+
_propertyName = propertyName;
125+
_objectType = objectType;
126+
}
127+
128+
public void SetValue(TObject command, TValue value)
129+
{
130+
if (_setter == null)
131+
{
132+
_setter = CreateSetter();
133+
}
134+
135+
_setter(command, value);
136+
137+
}
138+
139+
public TValue GetValue(TObject obj)
140+
{
141+
if (_getter == null)
142+
{
143+
_getter = CreateGetter();
144+
}
145+
146+
return _getter(obj);
147+
}
148+
149+
protected virtual Func<TObject, TValue> CreateGetter()
150+
{
151+
var inputVariable = Expression.Parameter(typeof(TObject));
152+
if (typeof(TObject) != _objectType)
153+
{
154+
var converted = Expression.Convert(inputVariable, _objectType);
155+
var retreiver = Expression.Property(converted, _objectType.GetProperty(_propertyName));
156+
return Expression.Lambda<Func<TObject, TValue>>(retreiver, inputVariable).Compile();
157+
}
158+
else
159+
{
160+
var retreiver = Expression.Property(inputVariable, _objectType.GetProperty(_propertyName));
161+
return Expression.Lambda<Func<TObject, TValue>>(retreiver, inputVariable).Compile();
162+
}
163+
164+
}
165+
166+
167+
protected virtual Action<TObject, TValue> CreateSetter()
168+
{
169+
var inputVariable = Expression.Parameter(typeof(TObject));
170+
var inputVariable2 = Expression.Parameter(typeof(TValue));
171+
172+
var convertExpression = Expression.Convert(inputVariable, _objectType);
173+
174+
var expression = Expression.Assign(
175+
Expression.PropertyOrField(convertExpression, _propertyName),
176+
inputVariable2);
177+
178+
return Expression.Lambda<Action<TObject, TValue>>(expression, inputVariable, inputVariable2).Compile();
179+
}
180+
}

‎src/Tests.Dapper.Oracle/Expressions/ObjectWrapperTests.cs‎

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using System.Data;
3+
using System.Linq;
34
using Dapper.Oracle;
45
using Dapper.Oracle.Expressions;
56
using FluentAssertions;
@@ -23,7 +24,7 @@ public static IEnumerable<object[]> OracleDataFixture
2324
#else
2425
yield return new object[] { new Managed.OracleCommand() };
2526
yield return new object[] { new UnManaged.OracleCommand() };
26-
#endif
27+
#endif
2728
}
2829
}
2930
}
@@ -35,11 +36,13 @@ public void BasicTest(IDbCommand cmd)
3536
{
3637
var param = cmd.CreateParameter();
3738

38-
var setter = new ObjectEnumWrapper<IDbDataParameter, OracleMappingType>("OracleDbType", "OracleDbType", param.GetType());
39+
var setter =
40+
new ObjectEnumWrapper<IDbDataParameter, OracleMappingType>("OracleDbType", "OracleDbType",
41+
param.GetType());
3942
setter.SetValue(param, OracleMappingType.Date);
4043
var value = setter.GetValue(param);
4144
value.ToString().Should().Be("Date");
42-
}
45+
}
4346
}
4447

4548
public class ObjectWrapperTests : ParameterBaseTests
@@ -49,9 +52,42 @@ public void Test(IDbCommand cmd)
4952
{
5053
var param = cmd.CreateParameter();
5154
var wrapper = new ObjectWrapper<IDbDataParameter, int>("Size", param.GetType());
52-
wrapper.SetValue(param,100);
55+
wrapper.SetValue(param, 100);
5356
var result = wrapper.GetValue(param);
5457
result.Should().Be(100);
5558
}
59+
60+
[Fact]
61+
public void SetPropertyOnClass()
62+
{
63+
var expected = Enumerable.Range(0, 10).ToArray();
64+
var input = new TestClass() {PropertyWithGetterAndSetter = expected};
65+
var testClass = new ObjectWrapper<TestClass,int[]>("PropertyWithGetterAndSetter",typeof(TestClass));
66+
67+
var actual = testClass.GetValue(input);
68+
actual.Should().BeSameAs(expected);
69+
}
70+
71+
[Fact]
72+
public void SetPropertyOnInterface()
73+
{
74+
var expected = Enumerable.Range(0, 10).ToArray();
75+
var input = new TestClass() { PropertyWithGetterAndSetter = expected };
76+
var testClass = new ObjectWrapper<ITestClass, int[]>("PropertyWithGetterAndSetter", typeof(TestClass));
77+
78+
var actual = testClass.GetValue(input);
79+
actual.Should().BeSameAs(expected);
80+
}
81+
82+
private class TestClass : ITestClass
83+
{
84+
public int[] PropertyWithGetterAndSetter { get; set; }
85+
86+
public bool PropertyWithGetterOnly { get; }
87+
}
88+
89+
private interface ITestClass { }
90+
5691
}
5792
}
93+

‎src/Tests.Dapper.Oracle/OracleDynamicParameterTests.cs‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,5 +153,20 @@ public void ArrayBindSizeSet_ValueIsSet(IDbCommand cmd, IOracleParameterRetretre
153153
param.Value.Should().Be("Bar");
154154
param.ArrayBindSize.Should().BeSameAs(bindSizeArray);
155155
}
156+
157+
[Theory, MemberData(nameof(OracleCommandFixture))]
158+
public void GetParameter_DoesNotReturnNull(IDbCommand cmd)
159+
{
160+
var bindSizeArray = Enumerable.Range(0, 20).ToArray();
161+
testObject.Add("Foo", "Bar", arrayBindSize: bindSizeArray);
162+
163+
testObject.AddParam(cmd);
164+
165+
cmd.Parameters.Should().HaveCount(1);
166+
var param = testObject.GetParameter("Foo");
167+
param.Name.Should().Be("Foo");
168+
param.Value.Should().Be("Bar");
169+
param.ArrayBindSize.Should().BeSameAs(bindSizeArray);
170+
}
156171
}
157172
}

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL