22using System ;
33using System . Collections . Generic ;
44using System . Linq . Expressions ;
5+ using System . Reflection ;
56
67namespace Milease . Core
78{
@@ -24,33 +25,42 @@ internal class ExprMetaData
2425
2526 public static void WarmUp < T , E > ( Expression < Func < T , E > > mbExpr )
2627 {
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
2838 {
2939 throw new Exception ( "You must pass in a MemberExpression to construct the animator." ) ;
3040 }
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 ) ;
3545 }
3646
37- internal static OffsetAnimatorExpression < T , E > GetExprWithOffset < T , E > ( MemberExpression memberExpr )
47+ internal static OffsetAnimatorExpression < T , E > GetExprWithOffset < T , E > ( MemberInfo memberInfo )
3848 {
39- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
49+ var key = ( typeof ( T ) , memberInfo . Name ) ;
4050 if ( offsetExpressionMap . TryGetValue ( key , out var expr ) )
4151 {
4252 return ( OffsetAnimatorExpression < T , E > ) expr ;
4353 }
4454
45- expr = MakeExprWithOffset < T , E > ( memberExpr ) ;
55+ expr = MakeExprWithOffset < T , E > ( memberInfo ) ;
4656 offsetExpressionMap . Add ( key , expr ) ;
4757 return ( OffsetAnimatorExpression < T , E > ) expr ;
4858 }
4959
50- private static OffsetAnimatorExpression < T , E > MakeExprWithOffset < T , E > ( MemberExpression memberExpr )
60+ private static OffsetAnimatorExpression < T , E > MakeExprWithOffset < T , E > ( MemberInfo memberInfo )
5161 {
5262 var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
53- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
63+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
5464
5565 var startParam = Expression . Parameter ( typeof ( E ) , "start" ) ;
5666 var endParam = Expression . Parameter ( typeof ( E ) , "end" ) ;
@@ -82,33 +92,33 @@ private static OffsetAnimatorExpression<T, E> MakeExprWithOffset<T, E>(MemberExp
8292 }
8393 }
8494
85- internal static AnimatorExpression < T , E > GetExpr < T , E > ( MemberExpression memberExpr )
95+ internal static AnimatorExpression < T , E > GetExpr < T , E > ( MemberInfo memberInfo )
8696 {
87- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
97+ var key = ( typeof ( T ) , memberInfo . Name ) ;
8898 if ( expressionMap . TryGetValue ( key , out var expr ) )
8999 {
90100 return ( AnimatorExpression < T , E > ) expr ;
91101 }
92102
93- expr = MakeExpr < T , E > ( memberExpr ) ;
103+ expr = MakeExpr < T , E > ( memberInfo ) ;
94104 expressionMap . Add ( key , expr ) ;
95105
96106#if UNITY_EDITOR
97107 MetaData . Add ( new ExprMetaData ( )
98108 {
99109 TName = typeof ( T ) . FullName ,
100110 EName = typeof ( E ) . FullName ,
101- MemberName = memberExpr . Member . Name
111+ MemberName = memberInfo . Name
102112 } ) ;
103113#endif
104114
105115 return ( AnimatorExpression < T , E > ) expr ;
106116 }
107117
108- private static AnimatorExpression < T , E > MakeExpr < T , E > ( MemberExpression memberExpr )
118+ private static AnimatorExpression < T , E > MakeExpr < T , E > ( MemberInfo memberInfo )
109119 {
110120 var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
111- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
121+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
112122
113123 var startParam = Expression . Parameter ( typeof ( E ) , "start" ) ;
114124 var endParam = Expression . Parameter ( typeof ( E ) , "end" ) ;
@@ -143,44 +153,44 @@ private static AnimatorExpression<T, E> MakeExpr<T, E>(MemberExpression memberEx
143153 }
144154 }
145155
146- internal static Func < T , E > GetValGetter < T , E > ( MemberExpression memberExpr )
156+ internal static Func < T , E > GetValGetter < T , E > ( MemberInfo memberInfo )
147157 {
148- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
158+ var key = ( typeof ( T ) , memberInfo . Name ) ;
149159 if ( valueGetterMap . TryGetValue ( key , out var expr ) )
150160 {
151161 return ( Func < T , E > ) expr ;
152162 }
153163
154- expr = MakeGetter < T , E > ( memberExpr ) ;
164+ expr = MakeGetter < T , E > ( memberInfo ) ;
155165 valueGetterMap . Add ( key , expr ) ;
156166 return ( Func < T , E > ) expr ;
157167 }
158168
159- private static Func < T , E > MakeGetter < T , E > ( MemberExpression memberExpr )
169+ private static Func < T , E > MakeGetter < T , E > ( MemberInfo memberInfo )
160170 {
161171 var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
162- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
172+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
163173
164174 return Expression . Lambda < Func < T , E > > ( mutableMemberExpr , targetParam ) . Compile ( ) ;
165175 }
166176
167- internal static Action < T , E > GetValSetter < T , E > ( MemberExpression memberExpr )
177+ internal static Action < T , E > GetValSetter < T , E > ( MemberInfo memberInfo )
168178 {
169- var key = ( typeof ( T ) , memberExpr . Member . Name ) ;
179+ var key = ( typeof ( T ) , memberInfo . Name ) ;
170180 if ( valueSetterMap . TryGetValue ( key , out var expr ) )
171181 {
172182 return ( Action < T , E > ) expr ;
173183 }
174184
175- expr = MakeSetter < T , E > ( memberExpr ) ;
185+ expr = MakeSetter < T , E > ( memberInfo ) ;
176186 valueSetterMap . Add ( key , expr ) ;
177187 return ( Action < T , E > ) expr ;
178188 }
179189
180- private static Action < T , E > MakeSetter < T , E > ( MemberExpression memberExpr )
190+ private static Action < T , E > MakeSetter < T , E > ( MemberInfo memberInfo )
181191 {
182192 var targetParam = Expression . Parameter ( typeof ( T ) , "target" ) ;
183- var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberExpr . Member ) ;
193+ var mutableMemberExpr = Expression . MakeMemberAccess ( targetParam , memberInfo ) ;
184194 var valParam = Expression . Parameter ( typeof ( E ) , "value" ) ;
185195
186196 return Expression . Lambda < Action < T , E > > (
0 commit comments