Bagikan melalui


Generik

.NET Multi-platform App UI (.NET MAUI) XAML menyediakan dukungan untuk menggunakan jenis CLR generik dengan menentukan batasan generik sebagai argumen jenis. Dukungan ini disediakan oleh direktif x:TypeArguments, yang meneruskan argumen jenis pembatas dari generik ke konstruktor tipe generik tersebut.

Argumen jenis ditentukan sebagai string, dan biasanya diawali, seperti sys:String dan sys:Int32. Awalan diperlukan karena tipe batasan generik CLR biasanya berasal dari pustaka yang tidak dipetakan langsung ke namespace .NET MAUI default. Namun, jenis bawaan XAML 2009 seperti x:String dan x:Int32, juga dapat ditentukan sebagai argumen jenis, di mana x adalah namespace bahasa XAML untuk XAML 2009. Untuk informasi selengkapnya tentang jenis bawaan XAML 2009, lihat XAML 2009 Language Primitives.

Penting

Menentukan jenis generik di .NET MAUI XAML, dengan direktif x:TypeArguments, tidak didukung.

Beberapa argumen jenis dapat ditentukan dengan menggunakan pemisah koma. Selain itu, jika batasan generik menggunakan jenis generik, argumen jenis batasan berlapis harus dimuat dalam tanda kurung.

Nota

Ekstensi markup x:Type menyediakan referensi jenis Common Language Runtime (CLR) untuk jenis generik, dan memiliki fungsi yang mirip dengan operator typeof di C#. Untuk informasi selengkapnya, lihat x:Type markup extension.

Untuk informasi tentang menentukan jenis generik di .NET MAUI XAML, dengan direktif x:DataType dan x:Type, lihat Mengkompilasi pengikatan yang menentukan jenis generik dan ekstensi markup x:Type.

Argumen jenis primitif tunggal

Argumen jenis primitif tunggal dapat ditentukan sebagai argumen string awalan menggunakan direktif 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>

Dalam contoh ini, System.Collections.Generic didefinisikan sebagai namespace scg XAML. Properti CollectionView.ItemsSource diatur ke List<T> yang diinstansiasi dengan argumen tipe string, menggunakan tipe bawaan XAML 2009 x:String. Koleksi List<string> diinisialisasi dengan sejumlah item string.

Sebagai alternatif yang setara, koleksi List<T> dapat diinisialisasi dengan tipe CLR String.

<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>

Argumen jenis objek tunggal

Argumen jenis objek tunggal dapat ditentukan sebagai argumen string awalan menggunakan direktif 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 x:DataType="models:Monkey">
                <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>

Dalam contoh ini, GenericsDemo.Models didefinisikan sebagai namespace models XAML, dan System.Collections.Generic didefinisikan sebagai namespace scg XAML. Properti CollectionView.ItemsSource diatur ke List<T> yang dibuat dengan argumen jenis Monkey. Koleksi List<Monkey> diinisialisasi dengan beberapa item Monkey, dan DataTemplate yang menentukan tampilan setiap objek Monkey ditetapkan sebagai ItemTemplate dari CollectionView.

Beberapa jenis argumen

Beberapa argumen jenis dapat ditentukan sebagai argumen string awalan, dibatasi oleh koma, menggunakan direktif x:TypeArguments. Saat batasan generik menggunakan jenis generik, argumen jenis batasan berlapis terkandung dalam tanda kurung:

<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 x:DataType="scg:KeyValuePair(x:String,models:Monkey)">
                <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    

Dalam contoh ini, GenericsDemo.Models didefinisikan sebagai namespace models XAML, dan System.Collections.Generic didefinisikan sebagai namespace scg XAML. Properti CollectionView.ItemsSource diatur ke List<T> yang dibuat dengan menggunakan kendala KeyValuePair<TKey, TValue>, dengan argumen tipe kendala dalam string dan Monkey. Koleksi List<KeyValuePair<string,Monkey>> diinisialisasi dengan beberapa item KeyValuePair menggunakan konstruktor KeyValuePair yang bukan default, dan DataTemplate yang menentukan tampilan setiap objek Monkey diatur sebagai ItemTemplate dari CollectionView. Untuk informasi tentang meneruskan argumen ke konstruktor non-default, lihat argumen konstruktor Pass.