此上下文封装了评估 SearchExpression 所需的所有数据,并允许用户与表达式的评估运行时进行交互。每当调用 SearchExpression.Execute 时,会使用 SearchExpressionRuntime 自动创建一个 SearchExpressionContext。
以下示例展示了在评估期间如何使用 SearchExpressionContext
[SearchExpressionEvaluator(SearchExpressionType.Iterable | SearchExpressionType.Variadic)] [SearchExpressionEvaluatorSignatureOverload(SearchExpressionType.Number, SearchExpressionType.Iterable | SearchExpressionType.Variadic)] [Description("Extract and returns the X first results for each expression.")] public static IEnumerable<SearchItem> TakeXFirst(SearchExpressionContext c) { var argIndex = 0; var takeNumber = 1; if (c.args[0].types.HasFlag(SearchExpressionType.Number)) { ++argIndex; takeNumber = Math.Max((int)(c.args[0].GetNumberValue(takeNumber)), 0); } for ( ; argIndex < c.args.Length; ++argIndex) { var iterable = c.args[argIndex].Execute(c); var taken = 0; foreach (var item in iterable) { if (item == null) yield return null; else { yield return item; ++taken; if (taken == takeNumber) { c.Break(); break; } } } } }
args | 传递给正在评估的 SearchExpression 的参数。 |
expression | 正在评估的 [[]SearchExpression]。 |
items | 由 searchExpression 评估产生的 SearchItems。 |
runtime | 与该上下文关联的 SearchExpressionRuntime。运行时存储评估 SearchExpression 所需的所有运行时数据(堆栈帧、上下文堆栈和项目)。 |
search | 包含用于创建 SearchExpression 的解析搜索查询的 SearchContex。 |
valid | 当前上下文是否有效。如果无效,则表示关联的 SearchExpression 为空,或 SearchExiressionRuntime 无效。 |
Break | 中断 SearchExpression 的评估,这意味着不再生成项目。 |
Continue | 告诉 SearchExpression 评估继续执行。 |
IsBreaking | 当前上下文是否已标记为中断执行? |
IsContinuing | 当前上下文是否已标记为继续执行? |
ResetIterationControl | 重新启动 SearchExpression 的评估和迭代。 |
ResolveAlias | 尝试使用附加到该上下文的 SearchExpressionRuntime 解析别名值。如果要求解析 SearchExpression.alias,则每帧都会解析一次。 |
ThrowError | 通过抛出 SearchExceptionEvaluatorException 停止 SearchExpression 评估。编写评估器的用户可以决定是否在传递给评估的参数无效或在评估过程中出现问题时抛出这些异常。 |
ToString | 获取上下文的字符串表示形式。 |