Skip to content

Commit b85c3d6

Browse files
committed
add PropertyTokenizer
add support nest object access by IGetAccessorFactory
1 parent e34e799 commit b85c3d6

File tree

12 files changed

+528
-50
lines changed

12 files changed

+528
-50
lines changed

build/version.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<VersionMajor>4</VersionMajor>
44
<VersionMinor>0</VersionMinor>
5-
<VersionPatch>86</VersionPatch>
5+
<VersionPatch>87</VersionPatch>
66
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
77
</PropertyGroup>
88
</Project>

src/SmartSql.Test.Unit/Reflection/GetAccessorFactoryTest.cs

Lines changed: 120 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
using SmartSql.Test.Entities;
33
using System;
44
using System.Collections.Generic;
5+
using System.Linq;
56
using System.Text;
7+
using SmartSql.Reflection;
68
using Xunit;
79

810
namespace SmartSql.Test.Unit.Reflection
@@ -13,8 +15,8 @@ public class GetAccessorFactoryTest
1315
public void Get_Id()
1416
{
1517
var obj = new AllPrimitive { };
16-
EmitGetAccessorFactory getAccessorFactory = new EmitGetAccessorFactory();
17-
var get_Id = getAccessorFactory.Create(typeof(AllPrimitive), nameof(AllPrimitive.Id));
18+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
19+
getAccessorFactory.TryCreate(typeof(AllPrimitive), nameof(AllPrimitive.Id), out var get_Id);
1820
var id = get_Id(obj);
1921
Assert.Equal(id, obj.Id);
2022
}
@@ -23,8 +25,8 @@ public void Get_Id()
2325
public void Get_Int32()
2426
{
2527
var obj = new AllPrimitive { };
26-
EmitGetAccessorFactory getAccessorFactory = new EmitGetAccessorFactory();
27-
var get_Id = getAccessorFactory.Create(typeof(AllPrimitive), nameof(AllPrimitive.Int32));
28+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
29+
getAccessorFactory.TryCreate(typeof(AllPrimitive), nameof(AllPrimitive.Int32), out var get_Id);
2830
var id = get_Id(obj);
2931
Assert.Equal(id, obj.Int32);
3032
}
@@ -33,10 +35,122 @@ public void Get_Int32()
3335
public void Get_String()
3436
{
3537
var obj = new AllPrimitive {String = "SmartSql"};
36-
EmitGetAccessorFactory getAccessorFactory = new EmitGetAccessorFactory();
37-
var get_String = getAccessorFactory.Create(typeof(AllPrimitive), nameof(AllPrimitive.String));
38+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
39+
getAccessorFactory.TryCreate(typeof(AllPrimitive), nameof(AllPrimitive.String), out var get_String);
3840
var str = get_String(obj);
3941
Assert.Equal(str, obj.String);
4042
}
43+
44+
[Fact]
45+
public void Get_Nest1()
46+
{
47+
var obj = new
48+
{
49+
User = new
50+
{
51+
Id = 1
52+
}
53+
};
54+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
55+
getAccessorFactory.TryCreate(obj.GetType(), "User.Id", out var getMethodImpl);
56+
var id = getMethodImpl(obj);
57+
Assert.Equal(id, obj.User.Id);
58+
}
59+
60+
[Fact]
61+
public void Get_Nest1_Obj()
62+
{
63+
var obj = new
64+
{
65+
User = new
66+
{
67+
Info = new
68+
{
69+
Id = 1
70+
}
71+
}
72+
};
73+
74+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
75+
getAccessorFactory.TryCreate(obj.GetType(), "User.Info", out var getMethodImpl);
76+
var info = getMethodImpl(obj);
77+
Assert.Equal(info, obj.User.Info);
78+
}
79+
80+
[Fact]
81+
public void Get_Nest2()
82+
{
83+
var obj = new
84+
{
85+
User = new
86+
{
87+
Info = new
88+
{
89+
Id = 1
90+
}
91+
}
92+
};
93+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
94+
getAccessorFactory.TryCreate(obj.GetType(), "User.Info.Id", out var getMethodImpl);
95+
var id = getMethodImpl(obj);
96+
Assert.Equal(id, obj.User.Info.Id);
97+
}
98+
99+
[Fact]
100+
public void Get_Dictionary_Index_String()
101+
{
102+
var obj = new
103+
{
104+
User = new
105+
{
106+
Items = new Dictionary<string, int>
107+
{
108+
{"Id", 1}
109+
}
110+
}
111+
};
112+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
113+
getAccessorFactory.TryCreate(obj.GetType(), "User.Items[Id]", out var getMethodImpl);
114+
var id = getMethodImpl(obj);
115+
Assert.Equal(obj.User.Items["Id"], id);
116+
}
117+
118+
[Fact]
119+
public void Get_Dictionary_Index()
120+
{
121+
var obj = new
122+
{
123+
User = new
124+
{
125+
Items = new Dictionary<int, int>
126+
{
127+
{1, 1}
128+
}
129+
}
130+
};
131+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
132+
getAccessorFactory.TryCreate(obj.GetType(), "User.Items[1]", out var getMethodImpl);
133+
var id = getMethodImpl(obj);
134+
Assert.Equal(obj.User.Items[1], id);
135+
}
136+
137+
[Fact]
138+
public void Get_List_Index()
139+
{
140+
var obj = new
141+
{
142+
User = new
143+
{
144+
Items = new List<String>
145+
{
146+
"SmartSql"
147+
}
148+
}
149+
};
150+
IGetAccessorFactory getAccessorFactory = EmitGetAccessorFactory.Instance;
151+
getAccessorFactory.TryCreate(obj.GetType(), "User.Items[0]", out var getMethodImpl);
152+
var id = getMethodImpl(obj);
153+
Assert.Equal(obj.User.Items[0], id);
154+
}
41155
}
42156
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using SmartSql.Exceptions;
4+
using SmartSql.Reflection;
5+
using Xunit;
6+
using Xunit.Abstractions;
7+
8+
namespace SmartSql.Test.Unit.Reflection
9+
{
10+
public class PropertyTokenizerTest
11+
{
12+
private readonly ITestOutputHelper _outputHelper;
13+
14+
public PropertyTokenizerTest(ITestOutputHelper outputHelper)
15+
{
16+
_outputHelper = outputHelper;
17+
}
18+
19+
[Fact]
20+
public void Access()
21+
{
22+
var propertyTokenizer = new PropertyTokenizer("User");
23+
24+
propertyTokenizer.MoveNext();
25+
var current = propertyTokenizer.Current;
26+
Assert.Equal("User", current.Name);
27+
Assert.Null(current.Index);
28+
Assert.Null(current.Children);
29+
30+
Assert.False(propertyTokenizer.MoveNext());
31+
}
32+
33+
[Fact]
34+
public void AccessNest1()
35+
{
36+
var propertyTokenizer = new PropertyTokenizer("User.Name");
37+
38+
propertyTokenizer.MoveNext();
39+
var current = propertyTokenizer.Current;
40+
Assert.Equal("User", current.Name);
41+
Assert.Null(current.Index);
42+
Assert.Equal("Name", current.Children);
43+
44+
propertyTokenizer.MoveNext();
45+
current = propertyTokenizer.Current;
46+
Assert.Equal("Name", current.Name);
47+
Assert.Null(current.Index);
48+
Assert.Null(current.Children);
49+
50+
Assert.False(propertyTokenizer.MoveNext());
51+
}
52+
53+
[Fact]
54+
public void AccessNest2()
55+
{
56+
var propertyTokenizer = new PropertyTokenizer("User.Info.Id");
57+
58+
propertyTokenizer.MoveNext();
59+
var current = propertyTokenizer.Current;
60+
Assert.Equal("User", current.Name);
61+
Assert.Null(current.Index);
62+
Assert.Equal("Info.Id", current.Children);
63+
64+
propertyTokenizer.MoveNext();
65+
current = propertyTokenizer.Current;
66+
Assert.Equal("Info", current.Name);
67+
Assert.Null(current.Index);
68+
Assert.Equal("Id", current.Children);
69+
70+
propertyTokenizer.MoveNext();
71+
current = propertyTokenizer.Current;
72+
Assert.Equal("Id", current.Name);
73+
Assert.Null(current.Index);
74+
Assert.Null(current.Children);
75+
76+
Assert.False(propertyTokenizer.MoveNext());
77+
}
78+
79+
[Fact]
80+
public void IndexAccess()
81+
{
82+
var propertyTokenizer = new PropertyTokenizer("Items[0]");
83+
84+
propertyTokenizer.MoveNext();
85+
var current = propertyTokenizer.Current;
86+
Assert.Equal("Items", current.Name);
87+
Assert.Equal("0", current.Index);
88+
Assert.Null(current.Children);
89+
90+
Assert.False(propertyTokenizer.MoveNext());
91+
}
92+
93+
[Fact]
94+
public void IndexAccessNest1()
95+
{
96+
var propertyTokenizer = new PropertyTokenizer("Order.Items[0]");
97+
98+
propertyTokenizer.MoveNext();
99+
var current = propertyTokenizer.Current;
100+
Assert.Equal("Order", current.Name);
101+
Assert.Null(current.Index);
102+
Assert.Equal("Items[0]", current.Children);
103+
104+
propertyTokenizer.MoveNext();
105+
current = propertyTokenizer.Current;
106+
Assert.Equal("Items", current.Name);
107+
Assert.Equal("0", current.Index);
108+
Assert.Null(current.Children);
109+
110+
Assert.False(propertyTokenizer.MoveNext());
111+
}
112+
113+
[Fact]
114+
public void IndexAccessString()
115+
{
116+
var propertyTokenizer = new PropertyTokenizer("Items[Name]");
117+
propertyTokenizer.MoveNext();
118+
var current = propertyTokenizer.Current;
119+
Assert.Equal("Items", current.Name);
120+
Assert.Equal("Name",current.Index);
121+
Assert.Null(current.Children);
122+
123+
}
124+
}
125+
}

src/SmartSql.Test.Unit/Reflection/SetAccessorFactoryTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class SetAccessorFactoryTest
1313
public void Set_Id()
1414
{
1515
var obj = new AllPrimitive { };
16-
EmitSetAccessorFactory setAccessorFactory = new EmitSetAccessorFactory();
16+
ISetAccessorFactory setAccessorFactory = EmitSetAccessorFactory.Instance;
1717
var set_Id = setAccessorFactory.Create(typeof(AllPrimitive), nameof(AllPrimitive.Id));
1818
set_Id(obj, 1L);
1919
Assert.Equal(1L, obj.Id);
@@ -23,7 +23,7 @@ public void Set_Id()
2323
public void Set_Int32()
2424
{
2525
var obj = new AllPrimitive { };
26-
EmitSetAccessorFactory setAccessorFactory = new EmitSetAccessorFactory();
26+
ISetAccessorFactory setAccessorFactory = EmitSetAccessorFactory.Instance;
2727
var set_Int32 = setAccessorFactory.Create(typeof(AllPrimitive), nameof(AllPrimitive.Int32));
2828
set_Int32(obj, 1);
2929
Assert.Equal(1, obj.Int32);

src/SmartSql/CUD/DbSessionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public static int Insert<TEntity>(this IDbSession dbSession, TEntity entity)
8282
});
8383
}
8484

85-
private static readonly ISetAccessorFactory _setAccessorFactory = new EmitSetAccessorFactory();
85+
private static readonly ISetAccessorFactory _setAccessorFactory = EmitSetAccessorFactory.Instance;
8686

8787
public static TPrimaryKey Insert<TEntity, TPrimaryKey>(this IDbSession dbSession, TEntity entity)
8888
{

src/SmartSql/CUD/EntityMetaDataCache.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace SmartSql.CUD
1111
{
1212
public static class EntityMetaDataCache<TEntity>
1313
{
14-
private static readonly EmitGetAccessorFactory GetAccessorFactory = new EmitGetAccessorFactory();
14+
private static readonly IGetAccessorFactory GetAccessorFactory = EmitGetAccessorFactory.Instance;
1515
public const string DEFAULT_ID_NAME = "Id";
1616
public static Type EntityType { get; }
1717
public static EntityMetaData MetaData { get; }

0 commit comments

Comments
 (0)