Udostępnij za pośrednictwem


Typy ogólne

Język XAML aplikacji wieloplatformowej platformy .NET (.NET MAUI) zapewnia obsługę korzystania z ogólnych typów CLR przez określenie ogólnych ograniczeń jako argumentów typu. Ta obsługa jest dostarczana przez dyrektywę x:TypeArguments , która przekazuje argumenty typu ograniczenia ogólnego do konstruktora typu ogólnego.

Argumenty typu są określane jako ciąg i są zwykle poprzedzone prefiksem, takimi jak sys:String i sys:Int32. Prefiksowanie jest wymagane, ponieważ typowe typy ograniczeń ogólnych CLR pochodzą z bibliotek, które nie są mapowane na domyślne przestrzenie nazw .NET MAUI. Jednak wbudowane typy XAML 2009, takie jak x:String i x:Int32, można również określić jako argumenty typu, gdzie x jest przestrzenią nazw języka XAML dla języka XAML 2009. Aby uzyskać więcej informacji na temat wbudowanych typów XAML 2009, zobacz XAML 2009 Language Primitives (Typy pierwotne języka XAML 2009).

Ważne

Definiowanie klas ogólnych w języku .NET MAUI XAML z dyrektywą x:TypeArguments nie jest obsługiwane.

Argumenty wielu typów można określić za pomocą ogranicznika przecinka. Ponadto, jeśli ograniczenie ogólne używa typów ogólnych, zagnieżdżone argumenty typu ograniczeń powinny być zawarte w nawiasach.

Uwaga

Rozszerzenie x:Type znaczników dostarcza odwołanie typu środowiska uruchomieniowego języka wspólnego (CLR) dla typu ogólnego i ma podobną funkcję do typeof operatora w języku C#. Aby uzyskać więcej informacji, zobacz x:Type markup extension (Rozszerzenie znaczników x:Type).

Argument pojedynczego typu pierwotnego

Argument pojedynczego typu pierwotnego można określić jako argument ciągu prefiksu przy użyciu x:TypeArguments dyrektywy :

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

W tym przykładzie System.Collections.Generic jest definiowana scg jako przestrzeń nazw XAML. Właściwość CollectionView.ItemsSource jest ustawiona na wystąpienie List<T> argumentu typu przy użyciu wbudowanego stringx:String typu XAML 2009. Kolekcja List<string> jest inicjowana z wieloma string elementami.

Alternatywnie, ale równoważnie, List<T> kolekcję można utworzyć za pomocą typu 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>

Argument typu pojedynczego obiektu

Argument typu pojedynczego obiektu można określić jako argument ciągu prefiksu przy użyciu x:TypeArguments dyrektywy :

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

W tym przykładzie GenericsDemo.Models jest definiowana models jako przestrzeń nazw XAML i System.Collections.Generic jest definiowana jako scg przestrzeń nazw XAML. Właściwość CollectionView.ItemsSource jest ustawiona na wystąpienie List<T> argumentu Monkey typu. Kolekcja List<Monkey> jest inicjowana z wieloma Monkey elementami, a element DataTemplate definiujący wygląd każdego Monkey obiektu jest ustawiany jako ItemTemplateCollectionViewelement .

Argumenty wielokrotnego typu

Argumenty wielu typów można określić jako prefiksowe argumenty ciągów rozdzielane przecinkami przy użyciu x:TypeArguments dyrektywy . Gdy ograniczenie ogólne używa typów ogólnych, argumenty typu ograniczenia zagnieżdżonego są zawarte w nawiasach:

<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    

W tym przykładzie GenericsDemo.Models jest definiowana models jako przestrzeń nazw XAML i System.Collections.Generic jest definiowana jako scg przestrzeń nazw XAML. Właściwość CollectionView.ItemsSource jest ustawiona na wystąpienie List<T> obiektu z ograniczeniem KeyValuePair<TKey, TValue> z argumentami string typu ograniczeń wewnętrznych i Monkey. Kolekcja List<KeyValuePair<string,Monkey>> jest inicjowana z wieloma KeyValuePair elementami, przy użyciu konstruktora innego niż domyślny KeyValuePair , a obiekt DataTemplate definiujący wygląd każdego Monkey obiektu jest ustawiany jako ItemTemplateCollectionViewelement . Aby uzyskać informacje na temat przekazywania argumentów do konstruktora innego niż domyślny, zobacz Przekazywanie argumentów konstruktora.