Dela via


Generika

.NET Multi-Platform App UI (.NET MAUI) XAML ger stöd för användning av generiska CLR-typer genom att ange de allmänna begränsningarna som typargument. Detta stöd tillhandahålls av x:TypeArguments-direktivet, som skickar de begränsande typargumenten för en generisk till konstruktorn av den generiska typen.

Typargument anges som en sträng och är vanligtvis prefix, till exempel sys:String och sys:Int32. Prefix krävs eftersom de typiska typerna av allmänna CLR-begränsningar kommer från bibliotek som inte är mappade till standardnamnrymderna för .NET MAUI. De inbyggda XAML 2009-typerna, till exempel x:String och x:Int32, kan dock också anges som typargument, där x är XAML-språknamnområdet för XAML 2009. Mer information om de inbyggda XAML 2009-typerna finns i XAML 2009 Language Primitives.

Viktig

Det går inte att definiera generiska typer i .NET MAUI XAML med x:TypeArguments-direktivet.

Flera typargument kan anges med hjälp av en kommaavgränsare. Om en allmän begränsning dessutom använder generiska typer bör argumenten för kapslad villkorstyp ingå i parenteser.

Note

x:Type-markeringstillägget tillhandahåller en CLR-typreferens (Common Language Runtime) för en allmän typ och har en liknande funktion som operatorn typeof i C#. Mer information finns i x:Type markup extension.

Information om hur du anger generiska typer i .NET MAUI XAML med direktiven x:DataType och x:Type finns i Kompilera bindningar som anger en allmän typ och x:Type markup extension.

Argument för enkel primitiv typ

Ett enda primitivt typargument kan anges som ett prefixsträngsargument med hjälp av x:TypeArguments-direktivet:

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

I det här exemplet definieras System.Collections.Generic som scg XAML-namnområde. Egenskapen CollectionView.ItemsSource är inställd på en List<T> som instansieras med ett string-typsargument, med hjälp av den inbyggda typen x:String i XAML 2009. Samlingen List<string> initieras med flera string objekt.

Alternativt, men motsvarande, kan samlingen List<T> instansieras med en CLR-String-typ.

<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 för enstaka objekttyp

Ett argument av typen enskild objekttyp kan anges som ett prefixsträngsargument med hjälp av x:TypeArguments-direktivet:

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

I det här exemplet definieras GenericsDemo.Models som models XAML-namnområde och System.Collections.Generic definieras som scg XAML-namnområde. Egenskapen CollectionView.ItemsSource är inställd på en List<T> som instansieras med ett argument av Monkey typ. Samlingen List<Monkey> initieras med flera Monkey objekt och en DataTemplate som definierar utseendet på varje Monkey objekt anges som ItemTemplate för CollectionView.

Argument av flera typer

Flera typargument kan anges som prefixsträngsargument, avgränsade med ett kommatecken, med hjälp av x:TypeArguments-direktivet. När en allmän begränsning använder generiska typer finns argumenten för kapslade villkorstyper i parenteser:

<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    

I det här exemplet definieras GenericsDemo.Models som models XAML-namnområde och System.Collections.Generic definieras som scg XAML-namnområde. Egenskapen CollectionView.ItemsSource är inställd på en List<T> som är instansierad med en begränsning av typen KeyValuePair<TKey, TValue>, med string och Monkeysom argument för den inre begränsningstypen. List<KeyValuePair<string,Monkey>>-samlingen initieras med flera KeyValuePair-objekt med hjälp av den icke-standardiserade konstruktorn KeyValuePair, och en DataTemplate som definierar utseendet på varje Monkey-objekt ställs in som ItemTemplate för CollectionView. Information om hur du skickar argument till en konstruktor som inte är standard finns i Skicka konstruktorargument.