Unity 6.3
0 онлайн 1 гость 4 в системе
Вход

Конструктор SearchExpressionEvaluatorAttribute

Declaration

public SearchExpressionEvaluatorAttribute(params SearchExpressionType[] signatureArgumentTypes);
public SearchExpressionEvaluatorAttribute(string name, params SearchExpressionType[] signatureArgumentTypes);
public SearchExpressionEvaluatorAttribute(Search.SearchExpressionEvaluationHints hints, params SearchExpressionType[] signatureArgumentTypes);
public SearchExpressionEvaluatorAttribute(string name, Search.SearchExpressionEvaluationHints hints, params SearchExpressionType[] signatureArgumentTypes);

Параметры

Параметр Описание
signatureArgumentTypes Массив типов, соответствующих типу параметров, используемых с этим оценивателем.
имя Имя оценщика. Если имя не указано, то будет использоваться имя функции оценщика.
советы Подсказки для указания времени выполнения оценщика, как должна запускаться функция.

Описание

С помощью этого атрибута статическая функция C# регистрируется как новый вычислитель. У SearchExpressionEvaluator при использовании внутри SearchExpression может иметь подпись, которая проверяется на соответствие переданным параметрам.

Здесь приведен пример использования параметра Variadic.

[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"));
    }
}