Skip to content

Commit f8ee44a

Browse files
authored
Custom conversion support in superclass properties (#3)
1 parent dd06e72 commit f8ee44a

File tree

6 files changed

+84
-14
lines changed

6 files changed

+84
-14
lines changed

DbDataReaderMapper/CustomPropertyConverter.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Linq.Expressions;
45
using System.Reflection;
56

@@ -43,7 +44,13 @@ public CustomPropertyConverter AddConversion<T, U, V>(Expression<Func<T, V>> pro
4344

4445
internal Delegate this[PropertyInfo key]
4546
{
46-
get => _conversionFunctions.ContainsKey(key) ? _conversionFunctions[key] : null;
47+
get
48+
{
49+
var resolvedKey = _conversionFunctions.Keys.FirstOrDefault(k => k.Name.Equals(key.Name));
50+
return resolvedKey == null
51+
? null
52+
: _conversionFunctions[resolvedKey];
53+
}
4754
}
4855
}
4956
}

DbDataReaderMapper/DbDataReaderMapper.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
<Company />
88
<PackageProjectUrl>https://github.com/LucaMozzo/DbDataReaderMapper</PackageProjectUrl>
99
<RepositoryUrl>https://github.com/LucaMozzo/DbDataReaderMapper</RepositoryUrl>
10-
<PackageReleaseNotes>Added support for netstandard2.1, addressing some of the vulnerabilities found in netstandard2.0</PackageReleaseNotes>
10+
<PackageReleaseNotes>Added support for custom converter applying on superclass properties conversion</PackageReleaseNotes>
1111
<NeutralLanguage>en</NeutralLanguage>
1212
<Description>This library that contains an extension of DbDataReader that automatically maps a database row to a model.</Description>
1313
<Copyright></Copyright>
1414
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1515
<PackageTags>db,database,mapper,data,reader</PackageTags>
1616
<RepositoryType>git</RepositoryType>
17-
<Version>1.2.0</Version>
17+
<Version>1.3.0</Version>
1818
<PackageReadmeFile>README.md</PackageReadmeFile>
1919
</PropertyGroup>
2020

@@ -27,6 +27,7 @@
2727

2828
<ItemGroup>
2929
<PackageReference Include="System.Data.Common" Version="4.3.0" />
30+
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
3031
</ItemGroup>
3132

3233
</Project>

Tests/DbDataReaderExtensionTest.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
using Microsoft.VisualStudio.TestTools.UnitTesting;
21
using System.Data.OleDb;
3-
using System.Threading.Tasks;
42
using DbDataReaderMapper;
53
using Tests.Model;
6-
using System;
74
using DbDataReaderMapper.Exceptions;
85

96
namespace Tests
@@ -294,5 +291,31 @@ public async Task TestMapperSubclassSetsSuperclassFields()
294291
});
295292
}
296293
}
294+
295+
[TestMethod]
296+
public async Task TestMapperSubclassSetsSuperclassFieldsWithCustomPropertyConverter()
297+
{
298+
OleDbCommand cmd = connection.CreateCommand();
299+
connection.Open();
300+
cmd.CommandText = "SELECT ID AS Id, FullName, Age, Address, DoB FROM Employee WHERE ID=1;";
301+
cmd.Connection = connection;
302+
303+
var converter = new CustomPropertyConverter()
304+
.AddConversion<EmployeeWrongTypeNeedsConversionSubclass, string, int>(e => e.Address, e => e.Length);
305+
306+
var reader = await cmd.ExecuteReaderAsync();
307+
while (await reader.ReadAsync())
308+
{
309+
var employeeObj = reader.MapToObject<EmployeeWrongTypeNeedsConversionSubclass>(converter);
310+
Assert.AreEqual(employeeObj, new EmployeeWrongTypeNeedsConversionSubclass
311+
{
312+
Id = reader.GetInt32(0),
313+
FullName = reader.GetString(1),
314+
Age = reader.GetInt32(2),
315+
Address = reader.GetString(3).Length,
316+
DoB = reader.GetDateTime(4)
317+
});
318+
}
319+
}
297320
}
298321
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
3+
namespace Tests.Model
4+
{
5+
internal class EmployeeWrongTypeNeedsConversionBaseClass
6+
{
7+
public int Id { get; set; }
8+
public int? Age { get; set; }
9+
public string FullName { get; set; }
10+
public int Address { get; set; } // refers to the address length. Used to test the custom converter on the superclass field
11+
}
12+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace Tests.Model
6+
{
7+
internal class EmployeeWrongTypeNeedsConversionSubclass : EmployeeWrongTypeNeedsConversionBaseClass
8+
{
9+
public DateTime? DoB { get; set; }
10+
11+
public override bool Equals(object obj)
12+
{
13+
return obj is EmployeeWrongTypeNeedsConversionSubclass fields &&
14+
Id == fields.Id &&
15+
Age == fields.Age &&
16+
Address == fields.Address &&
17+
FullName == fields.FullName &&
18+
DoB == fields.DoB;
19+
}
20+
}
21+
}

Tests/Tests.csproj

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp3.1</TargetFramework>
5-
6-
<IsPackable>false</IsPackable>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<LangVersion>latest</LangVersion>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
78
</PropertyGroup>
89

910
<ItemGroup>
10-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
11-
<PackageReference Include="MSTest.TestAdapter" Version="2.1.1" />
12-
<PackageReference Include="MSTest.TestFramework" Version="2.1.1" />
13-
<PackageReference Include="coverlet.collector" Version="1.3.0" />
14-
<PackageReference Include="System.Data.OleDb" Version="5.0.0" />
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
12+
<PackageReference Include="MSTest" Version="3.7.3" />
13+
<PackageReference Include="coverlet.collector" Version="6.0.4">
14+
<PrivateAssets>all</PrivateAssets>
15+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
16+
</PackageReference>
17+
<PackageReference Include="System.Data.OleDb" Version="9.0.1" />
1518
</ItemGroup>
1619

1720
<ItemGroup>
@@ -24,4 +27,7 @@
2427
</None>
2528
</ItemGroup>
2629

30+
<ItemGroup>
31+
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
32+
</ItemGroup>
2733
</Project>

0 commit comments

Comments
 (0)