Compartilhar via


Genéricos

O XAML da interface do usuário de aplicativo multiplataforma do .NET (.NET MAUI) oferece suporte para o consumo de tipos CLR genéricos especificando as restrições genéricas como argumentos de tipo. Esse suporte é fornecido pela diretiva x:TypeArguments, que passa os argumentos de tipo restritivos de um genérico para o construtor do tipo genérico.

Os argumentos de tipo são especificados como uma cadeia de caracteres e normalmente são prefixados, como sys:String e sys:Int32. O uso de prefixo é necessário porque os tipos típicos de restrições genéricas CLR vêm de bibliotecas que não são mapeadas para os namespaces padrão do .NET MAUI. No entanto, os tipos internos XAML 2009, como x:String e x:Int32, também podem ser especificados como argumentos de tipo, em que x é o namespace de linguagem XAML para XAML 2009. Para obter mais informações sobre os tipos internos do XAML 2009, consulte primitivos da linguagem XAML 2009.

Importante

A definição de tipos genéricos no XAML do .NET MAUI, com a diretiva x:TypeArguments, não tem suporte.

Vários argumentos de tipo podem ser especificados usando um delimitador de vírgula. Além disso, se uma restrição genérica usa tipos genéricos, os argumentos do tipo de restrição aninhada devem ser contidos em parênteses.

Nota

A extensão de marcação x:Type fornece uma referência de tipo CLR (Common Language Runtime) para um tipo genérico e tem uma função semelhante ao operador typeof em C#. Para obter mais informações, consulte a extensão de marcação x:Type .

Para obter informações sobre como especificar tipos genéricos no XAML do .NET MAUI, com as diretivas x:DataType e x:Type, consulte Compilar associações que especificam um tipo genérico e extensão de marcação x:Type.

Argumento de tipo primitivo único

Um único argumento de tipo primitivo pode ser especificado como um argumento de cadeia de caracteres prefixado usando a diretiva x:TypeArguments:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
             ...>
    <CollectionView>
        <CollectionView.ItemsSource>
            <scg:List x:TypeArguments="x:String">
                <x:String>Baboon</x:String>
                <x:String>Capuchin Monkey</x:String>
                <x:String>Blue Monkey</x:String>
                <x:String>Squirrel Monkey</x:String>
                <x:String>Golden Lion Tamarin</x:String>
                <x:String>Howler Monkey</x:String>
                <x:String>Japanese Macaque</x:String>
            </scg:List>
        </CollectionView.ItemsSource>
    </CollectionView>
</ContentPage>

Neste exemplo, System.Collections.Generic é definido como o namespace XAML scg. A propriedade CollectionView.ItemsSource é definida como um List<T> instanciado com um argumento de tipo string, usando o tipo interno XAML 2009 x:String. A coleção List<string> é inicializada com vários itens de string.

Como alternativa, de forma equivalente, a coleção List<T> pode ser instanciada com o tipo String do CLR:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
             xmlns:sys="clr-namespace:System;assembly=netstandard"
             ...>
    <CollectionView>
        <CollectionView.ItemsSource>
            <scg:List x:TypeArguments="sys:String">
                <sys:String>Baboon</sys:String>
                <sys:String>Capuchin Monkey</sys:String>
                <sys:String>Blue Monkey</sys:String>
                <sys:String>Squirrel Monkey</sys:String>
                <sys:String>Golden Lion Tamarin</sys:String>
                <sys:String>Howler Monkey</sys:String>
                <sys:String>Japanese Macaque</sys:String>
            </scg:List>
        </CollectionView.ItemsSource>
    </CollectionView>
</ContentPage>

Argumento de tipo de objeto único

Um argumento de tipo de objeto único pode ser especificado como um argumento de cadeia de caracteres prefixado usando a diretiva x:TypeArguments:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:models="clr-namespace:GenericsDemo.Models"
             xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
             ...>
    <CollectionView>
        <CollectionView.ItemsSource>
            <scg:List x:TypeArguments="models:Monkey">
                <models:Monkey Name="Baboon"
                               Location="Africa and Asia"
                               ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg" />
                <models:Monkey Name="Capuchin Monkey"
                               Location="Central and South America"
                               ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg" />
                <models:Monkey Name="Blue Monkey"
                               Location="Central and East Africa"
                               ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg" />
            </scg:List>
        </CollectionView.ItemsSource>
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid Padding="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Image Grid.RowSpan="2"
                           Source="{Binding ImageUrl}"
                           Aspect="AspectFill"
                           HeightRequest="60"
                           WidthRequest="60" />
                    <Label Grid.Column="1"
                           Text="{Binding Name}"
                           FontAttributes="Bold" />
                    <Label Grid.Row="1"
                           Grid.Column="1"
                           Text="{Binding Location}"
                           FontAttributes="Italic"
                           VerticalOptions="End" />
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</ContentPage>

Neste exemplo, GenericsDemo.Models é definido como o namespace XAML models e System.Collections.Generic é definido como o namespace XAML scg. A propriedade CollectionView.ItemsSource é definida como um List<T> instanciado com um argumento de tipo Monkey. A coleção List<Monkey> é inicializada com vários itens de Monkey e um DataTemplate que define a aparência de cada objeto Monkey é definido como o ItemTemplate do CollectionView.

Vários argumentos de tipo

Vários argumentos de tipo podem ser especificados como argumentos de cadeia de caracteres prefixados, delimitados por uma vírgula, usando a diretiva x:TypeArguments. Quando uma restrição genérica usa tipos genéricos, os argumentos de tipo de restrição aninhados são contidos em parênteses:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:models="clr-namespace:GenericsDemo.Models"
             xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
             ...>
    <CollectionView>
        <CollectionView.ItemsSource>
            <scg:List x:TypeArguments="scg:KeyValuePair(x:String,models:Monkey)">
                <scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
                    <x:Arguments>
                        <x:String>Baboon</x:String>
                        <models:Monkey Location="Africa and Asia"
                                       ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg" />
                    </x:Arguments>
                </scg:KeyValuePair>
                <scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
                    <x:Arguments>
                        <x:String>Capuchin Monkey</x:String>
                        <models:Monkey Location="Central and South America"
                                       ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg" />   
                    </x:Arguments>
                </scg:KeyValuePair>
                <scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
                    <x:Arguments>
                        <x:String>Blue Monkey</x:String>
                        <models:Monkey Location="Central and East Africa"
                                       ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg" />
                    </x:Arguments>
                </scg:KeyValuePair>
            </scg:List>
        </CollectionView.ItemsSource>
        <CollectionView.ItemTemplate>
            <DataTemplate>
                <Grid Padding="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Image Grid.RowSpan="2"
                           Source="{Binding Value.ImageUrl}"
                           Aspect="AspectFill"
                           HeightRequest="60"
                           WidthRequest="60" />
                    <Label Grid.Column="1"
                           Text="{Binding Key}"
                           FontAttributes="Bold" />
                    <Label Grid.Row="1"
                           Grid.Column="1"
                           Text="{Binding Value.Location}"
                           FontAttributes="Italic"
                           VerticalOptions="End" />
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
</ContentPage    

Neste exemplo, GenericsDemo.Models é definido como o namespace XAML models e System.Collections.Generic é definido como o namespace XAML scg. A propriedade CollectionView.ItemsSource é definida como um List<T> instanciado com uma restrição KeyValuePair<TKey, TValue>, com os argumentos de tipo de restrição interna string e Monkey. A coleção List<KeyValuePair<string,Monkey>> é inicializada com vários itens KeyValuePair usando o construtor KeyValuePair não padrão, e um DataTemplate que define a aparência de cada objeto Monkey é configurado como o ItemTemplate do CollectionView. Para obter informações sobre como passar argumentos para um construtor não padrão, consulte Passar argumentos para o construtor.