# SearchExpressionEvaluatorAttribute

> Use this attribute to register a static C# function as a new evaluator. SearchExpressionEvaluator when use within a SearchExpression can have a signature that is validated against the passed parameters.

## Definition

* **Type:** Constructor
* **Namespace:** [UnityEditor.Search](/engine/6000.5/script-reference/unityeditor/search.md)
* **Assembly:** UnityEditor

## SearchExpressionEvaluatorAttribute(SearchExpressionType\[])

Use this attribute to register a static C# function as a new evaluator. SearchExpressionEvaluator when use within a [SearchExpression](/engine/6000.5/script-reference/unityeditor/search/searchexpression.md) can have a signature that is validated against the passed parameters.

```csharp
public SearchExpressionEvaluatorAttribute(params SearchExpressionType[] signatureArgumentTypes)
```

### Parameters

**** (\[SearchExpressionType\[]]\(/engine/6000.5/script-reference/unityeditor/search/searchexpressiontype)): Array of types corresponding to the type of the parameters used with this evaluator.

### Remarks

Here is an example using a Variadic paramater.

```csharp
[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;
                }
            }
        }
    }
}
```

Here is an example not supporting thread evaluation.

```csharp
[Description("Returns ids of current selection")]
[SearchExpressionEvaluator(SearchExpressionEvaluationHints.ThreadNotSupported)]
public static IEnumerable<SearchItem> SelectionIds(SearchExpressionContext c)
{
    var entityIds = UnityEditor.Selection.entityIds;
    foreach (var id in entityIds)
    {
        EntityId entityId = id;
        yield return SearchExpression.CreateItem(UnsafeUtility.As<EntityId, ulong>(ref entityId), c.ResolveAlias("selected id"));
    }
}
```

## SearchExpressionEvaluatorAttribute(string, SearchExpressionType\[])

Use this attribute to register a static C# function as a new evaluator. SearchExpressionEvaluator when use within a [SearchExpression](/engine/6000.5/script-reference/unityeditor/search/searchexpression.md) can have a signature that is validated against the passed parameters.

```csharp
public SearchExpressionEvaluatorAttribute(string name, params SearchExpressionType[] signatureArgumentTypes)
```

### Parameters

**** (\[string]\(https\://learn.microsoft.com/dotnet/api/system.string)): N ame of the evaluator. If no name are specified the name of the evaluator functio will be used.**** (\[SearchExpressionType\[]]\(/engine/6000.5/script-reference/unityeditor/search/searchexpressiontype)): Array of types corresponding to the type of the parameters used with this evaluator.

### Remarks

Here is an example using a Variadic paramater.

```csharp
[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;
                }
            }
        }
    }
}
```

Here is an example not supporting thread evaluation.

```csharp
[Description("Returns ids of current selection")]
[SearchExpressionEvaluator(SearchExpressionEvaluationHints.ThreadNotSupported)]
public static IEnumerable<SearchItem> SelectionIds(SearchExpressionContext c)
{
    var entityIds = UnityEditor.Selection.entityIds;
    foreach (var id in entityIds)
    {
        EntityId entityId = id;
        yield return SearchExpression.CreateItem(UnsafeUtility.As<EntityId, ulong>(ref entityId), c.ResolveAlias("selected id"));
    }
}
```

## SearchExpressionEvaluatorAttribute(SearchExpressionEvaluationHints, SearchExpressionType\[])

Use this attribute to register a static C# function as a new evaluator. SearchExpressionEvaluator when use within a [SearchExpression](/engine/6000.5/script-reference/unityeditor/search/searchexpression.md) can have a signature that is validated against the passed parameters.

```csharp
public SearchExpressionEvaluatorAttribute(SearchExpressionEvaluationHints hints, params SearchExpressionType[] signatureArgumentTypes)
```

### Parameters

**** (\[SearchExpressionEvaluationHints]\(/engine/6000.5/script-reference/unityeditor/search/searchexpressionevaluationhints)): Hints to specify to the evaluator runtime how function should be run.**** (\[SearchExpressionType\[]]\(/engine/6000.5/script-reference/unityeditor/search/searchexpressiontype)): Array of types corresponding to the type of the parameters used with this evaluator.

### Remarks

Here is an example using a Variadic paramater.

```csharp
[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;
                }
            }
        }
    }
}
```

Here is an example not supporting thread evaluation.

```csharp
[Description("Returns ids of current selection")]
[SearchExpressionEvaluator(SearchExpressionEvaluationHints.ThreadNotSupported)]
public static IEnumerable<SearchItem> SelectionIds(SearchExpressionContext c)
{
    var entityIds = UnityEditor.Selection.entityIds;
    foreach (var id in entityIds)
    {
        EntityId entityId = id;
        yield return SearchExpression.CreateItem(UnsafeUtility.As<EntityId, ulong>(ref entityId), c.ResolveAlias("selected id"));
    }
}
```

## SearchExpressionEvaluatorAttribute(string, SearchExpressionEvaluationHints, SearchExpressionType\[])

Use this attribute to register a static C# function as a new evaluator. SearchExpressionEvaluator when use within a [SearchExpression](/engine/6000.5/script-reference/unityeditor/search/searchexpression.md) can have a signature that is validated against the passed parameters.

```csharp
public SearchExpressionEvaluatorAttribute(string name, SearchExpressionEvaluationHints hints, params SearchExpressionType[] signatureArgumentTypes)
```

### Parameters

**** (\[string]\(https\://learn.microsoft.com/dotnet/api/system.string)): N ame of the evaluator. If no name are specified the name of the evaluator functio will be used.**** (\[SearchExpressionEvaluationHints]\(/engine/6000.5/script-reference/unityeditor/search/searchexpressionevaluationhints)): Hints to specify to the evaluator runtime how function should be run.**** (\[SearchExpressionType\[]]\(/engine/6000.5/script-reference/unityeditor/search/searchexpressiontype)): Array of types corresponding to the type of the parameters used with this evaluator.

### Remarks

Here is an example using a Variadic paramater.

```csharp
[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;
                }
            }
        }
    }
}
```

Here is an example not supporting thread evaluation.

```csharp
[Description("Returns ids of current selection")]
[SearchExpressionEvaluator(SearchExpressionEvaluationHints.ThreadNotSupported)]
public static IEnumerable<SearchItem> SelectionIds(SearchExpressionContext c)
{
    var entityIds = UnityEditor.Selection.entityIds;
    foreach (var id in entityIds)
    {
        EntityId entityId = id;
        yield return SearchExpression.CreateItem(UnsafeUtility.As<EntityId, ulong>(ref entityId), c.ResolveAlias("selected id"));
    }
}
```
