# Converters

Converters are used to convert one type to another type, sometimes with additional parameters. For example, a value can be converted to a string using a given format. The BindingSystem provides examples of implementing converters in the code, making it easy to understand and extend this functionality. There are essentially 2 types of Converters: <mark style="color:blue;">Safe</mark> and <mark style="color:orange;">Unsafe</mark>. The latter may fail during conversion and invalidate the entire data retrieval pipeline.

{% tabs %}
{% tab title="Minimal UI" %}

<figure><img src="/files/Z3TVwGLCYZkyxPdVgMfS" alt="" width="563"><figcaption><p>Inspector View with a Converter</p></figcaption></figure>
{% endtab %}

{% tab title="Verbose UI" %}

<figure><img src="/files/Yt7SmJIYmotDTNJx49bd" alt=""><figcaption><p>Inspector View with a Converter</p></figcaption></figure>
{% endtab %}
{% endtabs %}

To add a new converter it is sufficient to implement `IConverter<TFrom, TTo>` interface:

```csharp
public class MyConverter : IConverter<bool, string>
{
    public string Id => "My Converter";
    public string Description => "Transforms a bool into Valid or Invalid string";
    public bool IsSafe => true; // The conversion will always succeed
    public string Convert(bool value)
    {
        return value ? "Valid" : "Invalid";
    }
    public object Convert(object value) => Convert(value is bool bValue ? bValue : false);
}
```

Implement `IContextConverter` in addition to `IConverter<,>` if the converter needs to have information about bind source and path.

The system will automatically pick up the new converter and add it to converters list. To avoid auto registration of the new converter, add `[HideMember]` attribute over the class.

{% hint style="info" %}
Sometimes the system will need another recompilation round to successfully register the new converter.
{% endhint %}

{% hint style="warning" %}
The converter must have a parameterless constructor.
{% endhint %}

When having multiple converters, the system will give the user the possiblity to select which converter to use:

<div data-full-width="true"><figure><img src="/files/gLhFUlkjzLw0Wni5eD41" alt=""><figcaption></figcaption></figure> <figure><img src="/files/XFQX1Kc1L4lYXcib3tqd" alt=""><figcaption></figcaption></figure></div>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://postica.gitbook.io/binding-system/product/extending-the-system/converters.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
