/// <summary> /// Evaluates the binding. /// </summary> internal object EvaluateBinding(ExpressionEvaluationVisitor visitor, string expression, string pathExpression) { // parse var node = ParseBinding(expression); var result = visitor.Visit(node); visitor.BackupCurrentPosition(result, pathExpression); return result; }
/// <summary> /// Resolves the path in the view model and returns the target object. /// </summary> private List<object> ResolveViewModelPath(object viewModel, RedwoodControl viewRootControl, string[] path) { var visitor = new ExpressionEvaluationVisitor(viewModel, viewRootControl); var outputHierarchy = new List<object>(); outputHierarchy.Add(viewModel); foreach (var expression in path) { // evaluate path fragment var pathTree = CSharpSyntaxTree.ParseText(expression, new CSharpParseOptions(LanguageVersion.CSharp5, DocumentationMode.Parse, SourceCodeKind.Interactive)); var pathExpr = pathTree.EnsureSingleExpression(); var result = visitor.Visit(pathExpr); visitor.BackupCurrentPosition(result, expression); outputHierarchy.Add(result); } return outputHierarchy; }
/// <summary> /// Finds the method on view model. /// </summary> private static MethodInfo FindMethodOnViewModel(object viewModel, RedwoodControl viewRootControl, List<object> hierarchy, InvocationExpressionSyntax node, out object target) { MethodInfo method; var methodEvaluator = new ExpressionEvaluationVisitor(viewModel, viewRootControl, hierarchy) { AllowMethods = true }; method = methodEvaluator.Visit(node.Expression) as MethodInfo; if (method == null) { throw new Exception("The command path was not found!"); } target = methodEvaluator.MethodInvocationTarget; return method; }
/// <summary> /// Evaluates the expression the on view model with specified hierarchy. /// </summary> private object EvaluateOnViewModel(object viewModel, RedwoodControl viewRootControl, List<object> hierarchy, string expression) { var pathTree = CSharpSyntaxTree.ParseText(expression, new CSharpParseOptions(LanguageVersion.CSharp5, DocumentationMode.Parse, SourceCodeKind.Interactive)); var pathExpr = pathTree.EnsureSingleExpression(); var visitor = new ExpressionEvaluationVisitor(viewModel, viewRootControl, hierarchy); return visitor.Visit(pathExpr); }
/// <summary> /// Evaluates the command arguments. /// </summary> private static object[] EvaluateCommandArguments(object viewModel, RedwoodControl viewRootControl, List<object> hierarchy, InvocationExpressionSyntax node) { var arguments = node.ArgumentList.Arguments.Select(a => { var evaluator = new ExpressionEvaluationVisitor(viewModel, viewRootControl, hierarchy); return evaluator.Visit(a); }).ToArray(); return arguments; }