signatureArgumentTypes | 与与此计算器配合使用的参数类型对应的类型数组。 |
name | 计算器的名称。如果未指定名称,将使用计算器函数的名称。 |
hints | 提示,以指定函数应如何运行的计算器运行时。 |
使用此属性将静态 C# 函数注册为新的计算器。在 SearchExpression 中使用时,SearchExpressionEvaluator 可以具有针对通过的参数验证的签名。
下面是一个带有不定长参数的示例。
[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; } } } } }
下面是一个不支持线程计算的示例。
[Description("Returns ids of current selection")] [SearchExpressionEvaluator(SearchExpressionEvaluationHints.ThreadNotSupported)] public static IEnumerable<SearchItem> SelectionIds(SearchExpressionContext c) { var instanceIds = UnityEditor.Selection.instanceIDs; foreach (var id in instanceIds) { yield return SearchExpression.CreateItem(id, c.ResolveAlias("selected id")); } }