private static void ParseRule <TEntity>(string entityType, RuleEntityContextMetadata ruleEntityMetadata, ref string ruleExpression, ref PlaceHolderTextParser place, string placeHolder, Dictionary <string, string> customplaceholders) where TEntity : RuleAwareEntity { string replacedString = ""; bool isDynamicProperty; if (placeHolder.Contains(".")) { if (TryParseComplexProperty(entityType, ruleEntityMetadata, placeHolder, typeof(TEntity), customplaceholders, out replacedString)) { ruleExpression = Replace(ruleExpression, place.startplaceHolderpos, place.endPlaceHolderpos, replacedString); } } else if (TryParseSimpleProperty(entityType, ruleEntityMetadata, placeHolder, typeof(TEntity), out replacedString, out isDynamicProperty , customplaceholders)) { ruleExpression = Replace(ruleExpression, place.startplaceHolderpos, place.endPlaceHolderpos, replacedString); } else { ruleExpression = Replace(ruleExpression, place.startplaceHolderpos, place.endPlaceHolderpos , placeHolder); } place = new PlaceHolderTextParser(ruleExpression); }
internal static string ParseRulePlaceHolder <TEntity>(RuleEngineContext.RuleEngineContext context, string ruleExpression, Dictionary <string, string> customplaceholders) where TEntity : RuleAwareEntity { PlaceHolderTextParser place = new PlaceHolderTextParser(ruleExpression); string placeHolder; string placeHolderWithParenthesis; while (place.NextPlaceHolder(out placeHolder, out placeHolderWithParenthesis)) { ParseRule <TEntity>(context.RootEntityType, context.EntityContextMetadata, ref ruleExpression, ref place, placeHolder, customplaceholders); } return(ruleExpression); }
public Delegate ParseGroupString(RuleEngineContext.RuleEngineContext contex, string placeHolderExpression) { IPlaceHolderParser <TEntity> placeHolderParser = RuleExpressionParserFactory.CreatePalceHolderParser <TEntity>(); placeHolderParser.AddPlaceHolders(_placeholders); string[] expressions = placeHolderExpression.Split(','); int propertyCounter = 1; PlaceHolderTextParser place = new PlaceHolderTextParser(placeHolderExpression); List <string> lstExpressions = new List <string>(); foreach (var expr in expressions) { try { string parsedExpression = placeHolderParser.ParsePlaceHolder(contex, string.Format("({0}) as Prop{1}", expr, propertyCounter)); lstExpressions.Add(parsedExpression); propertyCounter = propertyCounter + 1; } catch (System.Exception ex) { throw new ExpressionParserException("GroupKeyExpressionParser", placeHolderExpression, contex.RuleEngineId, ex); } } var inputExpression = string.Format("new ({0})", string.Join(",", lstExpressions)); try { var lamdaexpr = DynamicExpressionParser .ParseLambda(contex.EntityContextMetadata.GetRuleParserConfig(), true, typeof(TEntity), null, inputExpression); return(lamdaexpr.Compile()); } catch (Exception ex) { throw new ExpressionParserException("GroupKeyExpressionParser", placeHolderExpression, inputExpression, contex.RuleEngineId, ex); } }