@@ -22,7 +22,7 @@ namespace Xtensive.Core
22
22
/// </summary>
23
23
public static class ExpressionExtensions
24
24
{
25
- private readonly static ConcurrentDictionary < Type , object > StructDefaultValues = new ( ) ;
25
+ private readonly static ConcurrentDictionary < Type , ConstantExpression > StructDefaultConstantExpressions = new ( ) ;
26
26
27
27
/// <summary>
28
28
/// Formats the <paramref name="expression"/>.
@@ -73,26 +73,31 @@ public static bool IsNull(this Expression expression)
73
73
/// <exception cref="InvalidOperationException">Something went wrong :(.</exception>
74
74
public static Expression BindParameters ( this LambdaExpression lambdaExpression , params Expression [ ] parameters )
75
75
{
76
- if ( lambdaExpression . Parameters . Count != parameters . Length )
76
+ var lambdaExpressionParameters = lambdaExpression . Parameters ;
77
+ var lambdaExpressionParametersCount = lambdaExpressionParameters . Count ;
78
+ if ( lambdaExpressionParametersCount != parameters . Length )
77
79
throw new InvalidOperationException ( String . Format (
78
80
Strings . ExUnableToBindParametersToLambdaXParametersCountIsIncorrect ,
79
81
lambdaExpression . ToString ( true ) ) ) ;
80
- if ( parameters . Length == 0 )
82
+ if ( parameters . Length == 0 )
81
83
return lambdaExpression ;
82
84
var convertedParameters = new Expression [ parameters . Length ] ;
83
- for ( int i = 0 ; i < lambdaExpression . Parameters . Count ; i ++ ) {
84
- var expressionParameter = lambdaExpression . Parameters [ i ] ;
85
- if ( expressionParameter . Type . IsAssignableFrom ( parameters [ i ] . Type ) )
86
- convertedParameters [ i ] = expressionParameter . Type == parameters [ i ] . Type
87
- ? parameters [ i ]
88
- : Expression . Convert ( parameters [ i ] , expressionParameter . Type ) ;
85
+ for ( int i = 0 ; i < lambdaExpressionParametersCount ; i ++ ) {
86
+ var expressionParameter = lambdaExpressionParameters [ i ] ;
87
+ var parameter = parameters [ i ] ;
88
+ var parameterType = parameter . Type ;
89
+ var expressionParameterType = expressionParameter . Type ;
90
+ if ( expressionParameterType . IsAssignableFrom ( parameterType ) )
91
+ convertedParameters [ i ] = expressionParameterType == parameterType
92
+ ? parameter
93
+ : Expression . Convert ( parameter , expressionParameterType ) ;
89
94
else
90
95
throw new InvalidOperationException ( String . Format (
91
96
Strings . ExUnableToUseExpressionXAsXParameterOfLambdaXBecauseOfTypeMistmatch ,
92
- parameters [ i ] . ToString ( true ) , i , lambdaExpression . Parameters [ i ] . ToString ( true ) ) ) ;
97
+ parameters [ i ] . ToString ( true ) , i , expressionParameter . ToString ( true ) ) ) ;
93
98
}
94
99
return ExpressionReplacer . ReplaceAll (
95
- lambdaExpression . Body , lambdaExpression . Parameters , convertedParameters ) ;
100
+ lambdaExpression . Body , lambdaExpressionParameters , convertedParameters ) ;
96
101
}
97
102
98
103
/// <summary>
@@ -121,28 +126,15 @@ public static Expression ToExpression(this SerializableExpression expression)
121
126
/// </summary>
122
127
/// <param name="defaultExpression">The expression to convert.</param>
123
128
/// <returns>Result constant expression.</returns>
124
- public static ConstantExpression ToConstantExpression ( this DefaultExpression defaultExpression )
125
- {
126
- var value = GetDefaultValue ( defaultExpression ) ;
127
-
128
- return Expression . Constant ( value , defaultExpression . Type ) ;
129
- }
130
-
131
- /// <summary>
132
- /// Gets the value represented by given <see cref="DefaultExpression"/>.
133
- /// </summary>
134
- /// <param name="defaultExpression">The default value expression.</param>
135
- /// <returns>Object value of default value.</returns>
136
- public static object GetDefaultValue ( this DefaultExpression defaultExpression )
137
- {
138
- if ( defaultExpression . Type . IsValueType ) {
139
- return StructDefaultValues . GetOrAdd < DefaultExpression > (
140
- defaultExpression . Type ,
141
- ( type , expr ) => { return ( ( Func < object > ) Expression . Lambda ( Expression . Convert ( expr , WellKnownTypes . Object ) ) . Compile ( ) ) . Invoke ( ) ; } ,
142
- defaultExpression ) ;
143
- }
144
- return null ;
145
- }
129
+ public static ConstantExpression ToConstantExpression ( this DefaultExpression defaultExpression ) =>
130
+ StructDefaultConstantExpressions . GetOrAdd (
131
+ defaultExpression . Type ,
132
+ static ( t , expr ) => Expression . Constant (
133
+ t . IsValueType
134
+ ? ( ( Func < object > ) Expression . Lambda ( Expression . Convert ( expr , WellKnownTypes . Object ) ) . Compile ( ) ) . Invoke ( )
135
+ : null ,
136
+ t ) ,
137
+ defaultExpression ) ;
146
138
147
139
/// <summary>
148
140
/// Gets return type of <see cref="LambdaExpression"/>.
@@ -318,4 +310,4 @@ public static Expression StripMemberAccessChain(this Expression expression)
318
310
319
311
#endregion
320
312
}
321
- }
313
+ }
0 commit comments