2
2
using System ;
3
3
using System . Collections . Generic ;
4
4
using System . Linq . Expressions ;
5
+ using System . Reflection ;
5
6
6
7
namespace Milease . Core
7
8
{
@@ -24,33 +25,42 @@ internal class ExprMetaData
24
25
25
26
public static void WarmUp < T , E > ( Expression < Func < T , E > > mbExpr )
26
27
{
27
- if ( mbExpr . Body is not MemberExpression memberExpr )
28
+ MemberInfo memberInfo = null ;
29
+ if ( mbExpr . Body is MemberExpression memberExpr )
30
+ {
31
+ memberInfo = memberExpr . Member ;
32
+ }
33
+ else if ( mbExpr . Body is UnaryExpression unaryExpr && unaryExpr . Operand is MemberExpression propExpr )
34
+ {
35
+ memberInfo = propExpr . Member ;
36
+ }
37
+ else
28
38
{
29
39
throw new Exception ( "You must pass in a MemberExpression to construct the animator." ) ;
30
40
}
31
- _ = GetExprWithOffset < T , E > ( memberExpr ) ;
32
- _ = GetExpr < T , E > ( memberExpr ) ;
33
- _ = GetValSetter < T , E > ( memberExpr ) ;
34
- _ = GetValGetter < T , E > ( memberExpr ) ;
41
+ _ = GetExprWithOffset < T , E > ( memberInfo ) ;
42
+ _ = GetExpr < T , E > ( memberInfo ) ;
43
+ _ = GetValSetter < T , E > ( memberInfo ) ;
44
+ _ = GetValGetter < T , E > ( memberInfo ) ;
35
45
}
36
46
37
- internal static OffsetAnimatorExpression < T , E > GetExprWithOffset < T , E > ( MemberExpression memberExpr )
47
+ internal static OffsetAnimatorExpression < T , E > GetExprWithOffset < T , E > ( MemberInfo memberInfo )
38
48
{
39
- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
49
+ var key = ( typeof ( T ) , memberInfo . Name ) ;
40
50
if ( offsetExpressionMap . TryGetValue ( key , out var expr ) )
41
51
{
42
52
return ( OffsetAnimatorExpression < T , E > ) expr ;
43
53
}
44
54
45
- expr = MakeExprWithOffset < T , E > ( memberExpr ) ;
55
+ expr = MakeExprWithOffset < T , E > ( memberInfo ) ;
46
56
offsetExpressionMap . Add ( key , expr ) ;
47
57
return ( OffsetAnimatorExpression < T , E > ) expr ;
48
58
}
49
59
50
- private static OffsetAnimatorExpression < T , E > MakeExprWithOffset < T , E > ( MemberExpression memberExpr )
60
+ private static OffsetAnimatorExpression < T , E > MakeExprWithOffset < T , E > ( MemberInfo memberInfo )
51
61
{
52
62
var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
53
- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
63
+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
54
64
55
65
var startParam = Expression . Parameter ( typeof ( E ) , "start" ) ;
56
66
var endParam = Expression . Parameter ( typeof ( E ) , "end" ) ;
@@ -82,33 +92,33 @@ private static OffsetAnimatorExpression<T, E> MakeExprWithOffset<T, E>(MemberExp
82
92
}
83
93
}
84
94
85
- internal static AnimatorExpression < T , E > GetExpr < T , E > ( MemberExpression memberExpr )
95
+ internal static AnimatorExpression < T , E > GetExpr < T , E > ( MemberInfo memberInfo )
86
96
{
87
- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
97
+ var key = ( typeof ( T ) , memberInfo . Name ) ;
88
98
if ( expressionMap . TryGetValue ( key , out var expr ) )
89
99
{
90
100
return ( AnimatorExpression < T , E > ) expr ;
91
101
}
92
102
93
- expr = MakeExpr < T , E > ( memberExpr ) ;
103
+ expr = MakeExpr < T , E > ( memberInfo ) ;
94
104
expressionMap . Add ( key , expr ) ;
95
105
96
106
#if UNITY_EDITOR
97
107
MetaData . Add ( new ExprMetaData ( )
98
108
{
99
109
TName = typeof ( T ) . FullName ,
100
110
EName = typeof ( E ) . FullName ,
101
- MemberName = memberExpr . Member . Name
111
+ MemberName = memberInfo . Name
102
112
} ) ;
103
113
#endif
104
114
105
115
return ( AnimatorExpression < T , E > ) expr ;
106
116
}
107
117
108
- private static AnimatorExpression < T , E > MakeExpr < T , E > ( MemberExpression memberExpr )
118
+ private static AnimatorExpression < T , E > MakeExpr < T , E > ( MemberInfo memberInfo )
109
119
{
110
120
var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
111
- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
121
+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
112
122
113
123
var startParam = Expression . Parameter ( typeof ( E ) , "start" ) ;
114
124
var endParam = Expression . Parameter ( typeof ( E ) , "end" ) ;
@@ -143,44 +153,44 @@ private static AnimatorExpression<T, E> MakeExpr<T, E>(MemberExpression memberEx
143
153
}
144
154
}
145
155
146
- internal static Func < T , E > GetValGetter < T , E > ( MemberExpression memberExpr )
156
+ internal static Func < T , E > GetValGetter < T , E > ( MemberInfo memberInfo )
147
157
{
148
- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
158
+ var key = ( typeof ( T ) , memberInfo . Name ) ;
149
159
if ( valueGetterMap . TryGetValue ( key , out var expr ) )
150
160
{
151
161
return ( Func < T , E > ) expr ;
152
162
}
153
163
154
- expr = MakeGetter < T , E > ( memberExpr ) ;
164
+ expr = MakeGetter < T , E > ( memberInfo ) ;
155
165
valueGetterMap . Add ( key , expr ) ;
156
166
return ( Func < T , E > ) expr ;
157
167
}
158
168
159
- private static Func < T , E > MakeGetter < T , E > ( MemberExpression memberExpr )
169
+ private static Func < T , E > MakeGetter < T , E > ( MemberInfo memberInfo )
160
170
{
161
171
var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
162
- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
172
+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
163
173
164
174
return Expression . Lambda < Func < T , E > > ( mutableMemberExpr , targetParam ) . Compile ( ) ;
165
175
}
166
176
167
- internal static Action < T , E > GetValSetter < T , E > ( MemberExpression memberExpr )
177
+ internal static Action < T , E > GetValSetter < T , E > ( MemberInfo memberInfo )
168
178
{
169
- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
179
+ var key = ( typeof ( T ) , memberInfo . Name ) ;
170
180
if ( valueSetterMap . TryGetValue ( key , out var expr ) )
171
181
{
172
182
return ( Action < T , E > ) expr ;
173
183
}
174
184
175
- expr = MakeSetter < T , E > ( memberExpr ) ;
185
+ expr = MakeSetter < T , E > ( memberInfo ) ;
176
186
valueSetterMap . Add ( key , expr ) ;
177
187
return ( Action < T , E > ) expr ;
178
188
}
179
189
180
- private static Action < T , E > MakeSetter < T , E > ( MemberExpression memberExpr )
190
+ private static Action < T , E > MakeSetter < T , E > ( MemberInfo memberInfo )
181
191
{
182
192
var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
183
- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
193
+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
184
194
var valParam = Expression . Parameter ( typeof ( E ) , "value" ) ;
185
195
186
196
return Expression . Lambda < Action < T , E > > (
0 commit comments