88using System . Collections . Generic ;
99using System . Linq ;
1010using System . Linq . Dynamic . Core ;
11+ using System . Linq . Dynamic . Core . Exceptions ;
1112using System . Linq . Dynamic . Core . Parser ;
1213using System . Linq . Expressions ;
1314using System . Reflection ;
15+ using System . Text . RegularExpressions ;
1416
1517namespace RulesEngine . ExpressionBuilders
1618{
@@ -33,25 +35,46 @@ private void PopulateMethodInfo()
3335 }
3436 public Expression Parse ( string expression , ParameterExpression [ ] parameters , Type returnType )
3537 {
36- var config = new ParsingConfig {
38+ var config = new ParsingConfig {
3739 CustomTypeProvider = new CustomTypeProvider ( _reSettings . CustomTypes ) ,
3840 IsCaseSensitive = _reSettings . IsExpressionCaseSensitive
39- } ;
40- return new ExpressionParser ( parameters , expression , new object [ ] { } , config ) . Parse ( returnType ) ;
41-
41+ } ;
42+
43+ // Instead of immediately returning default values, allow for expression parsing to handle dynamic evaluation.
44+ try
45+ {
46+ return new ExpressionParser ( parameters , expression , Array . Empty < object > ( ) , config ) . Parse ( returnType ) ;
47+ }
48+ catch ( ParseException )
49+ {
50+ return Expression . Constant ( GetDefaultValueForType ( returnType ) ) ;
51+ }
52+ catch ( Exception ex )
53+ {
54+ throw new Exception ( $ "Expression parsing error: { ex . Message } ", ex ) ;
55+ }
4256 }
4357
58+ private object GetDefaultValueForType ( Type type )
59+ {
60+ if ( type == typeof ( bool ) )
61+ return false ;
62+ if ( type == typeof ( int ) || type == typeof ( float ) || type == typeof ( double ) )
63+ return int . MinValue ;
64+ return null ;
65+ }
66+
4467 public Func < object [ ] , T > Compile < T > ( string expression , RuleParameter [ ] ruleParams )
4568 {
4669 var rtype = typeof ( T ) ;
47- if ( rtype == typeof ( object ) )
70+ if ( rtype == typeof ( object ) )
4871 {
4972 rtype = null ;
5073 }
51- var parameterExpressions = GetParameterExpression ( ruleParams ) . ToArray ( ) ;
52-
74+ var parameterExpressions = GetParameterExpression ( ruleParams ) . ToArray ( ) ;
75+
5376 var e = Parse ( expression , parameterExpressions , rtype ) ;
54- if ( rtype == null )
77+ if ( rtype == null )
5578 {
5679 e = Expression . Convert ( e , typeof ( T ) ) ;
5780 }
@@ -63,7 +86,7 @@ public Func<object[], T> Compile<T>(string expression, RuleParameter[] ruleParam
6386
6487 private Func < object [ ] , T > CompileExpression < T > ( Expression < Func < object [ ] , T > > expression )
6588 {
66- if ( _reSettings . UseFastExpressionCompiler )
89+ if ( _reSettings . UseFastExpressionCompiler )
6790 {
6891 return expression . CompileFast ( ) ;
6992 }
@@ -82,15 +105,15 @@ private Expression<Func<object[], T>> WrapExpression<T>(List<Expression> express
82105 return Expression . Lambda < Func < object [ ] , T > > ( blockExp , argExp ) ;
83106 }
84107
85- internal Func < object [ ] , Dictionary < string , object > > CompileRuleExpressionParameters ( RuleParameter [ ] ruleParams , RuleExpressionParameter [ ] ruleExpParams = null )
108+ internal Func < object [ ] , Dictionary < string , object > > CompileRuleExpressionParameters ( RuleParameter [ ] ruleParams , RuleExpressionParameter [ ] ruleExpParams = null )
86109 {
87110 ruleExpParams = ruleExpParams ?? new RuleExpressionParameter [ ] { } ;
88111 var expression = CreateDictionaryExpression ( ruleParams , ruleExpParams ) ;
89112 return CompileExpression ( expression ) ;
90113 }
91114
92115 public T Evaluate < T > ( string expression , RuleParameter [ ] ruleParams )
93- {
116+ {
94117 var func = Compile < T > ( expression , ruleParams ) ;
95118 return func ( ruleParams . Select ( c => c . Value ) . ToArray ( ) ) ;
96119 }
@@ -125,7 +148,7 @@ private IEnumerable<ParameterExpression> GetParameterExpression(RuleParameter[]
125148 }
126149 }
127150
128- private Expression < Func < object [ ] , Dictionary < string , object > > > CreateDictionaryExpression ( RuleParameter [ ] ruleParams , RuleExpressionParameter [ ] ruleExpParams )
151+ private Expression < Func < object [ ] , Dictionary < string , object > > > CreateDictionaryExpression ( RuleParameter [ ] ruleParams , RuleExpressionParameter [ ] ruleExpParams )
129152 {
130153 var body = new List < Expression > ( ) ;
131154 var paramExp = new List < ParameterExpression > ( ) ;
@@ -142,22 +165,22 @@ private Expression<Func<object[],Dictionary<string,object>>> CreateDictionaryExp
142165 body . Add ( Expression . Assign ( dict , Expression . New ( typeof ( Dictionary < string , object > ) ) ) ) ;
143166 variableExp . Add ( dict ) ;
144167
145- for ( var i = 0 ; i < ruleParams . Length ; i ++ )
168+ for ( var i = 0 ; i < ruleParams . Length ; i ++ )
146169 {
147170 paramExp . Add ( ruleParams [ i ] . ParameterExpression ) ;
148171 }
149- for ( var i = 0 ; i < ruleExpParams . Length ; i ++ )
172+ for ( var i = 0 ; i < ruleExpParams . Length ; i ++ )
150173 {
151174 var key = Expression . Constant ( ruleExpParams [ i ] . ParameterExpression . Name ) ;
152175 var value = Expression . Convert ( ruleExpParams [ i ] . ParameterExpression , typeof ( object ) ) ;
153176 variableExp . Add ( ruleExpParams [ i ] . ParameterExpression ) ;
154- body . Add ( Expression . Call ( dict , add , key , value ) ) ;
155-
177+ body . Add ( Expression . Call ( dict , add , key , value ) ) ;
178+
156179 }
157180 // Return value
158181 body . Add ( dict ) ;
159182
160- return WrapExpression < Dictionary < string , object > > ( body , paramExp . ToArray ( ) , variableExp . ToArray ( ) ) ;
183+ return WrapExpression < Dictionary < string , object > > ( body , paramExp . ToArray ( ) , variableExp . ToArray ( ) ) ;
161184 }
162185 }
163- }
186+ }
0 commit comments