public override void Visit(IdentifierExpression identifier) { if (Parameters.ContainsKey(identifier.Name)) { // The parameter is defined in the dictionary if (Parameters[identifier.Name] is Expression) { // The parameter is itself another Expression var expression = (Expression)Parameters[identifier.Name]; // Overloads parameters foreach (var p in Parameters) { expression.Parameters[p.Key] = p.Value; } expression.EvaluateFunction += EvaluateFunction; expression.EvaluateParameter += EvaluateParameter; Result = ((Expression)Parameters[identifier.Name]).Evaluate(flow); } else { Result = Parameters[identifier.Name]; } } else { // The parameter should be defined in a callback method var args = new ParameterArgs(); // Calls external implementation OnEvaluateParameter(identifier.Name, args); if (!args.HasResult) { throw new ArgumentException("Parameter was not defined", identifier.Name); } Result = args.Result; } }
private void OnEvaluateParameter(string name, ParameterArgs args) { EvaluateParameter?.Invoke(flow, name, args); }