Freigeben über


Generika

.NET Multi-platform App UI (.NET MAUI) XAML bietet Unterstützung für die Verwendung generischer CLR-Typen, indem die generischen Einschränkungen als Typargumente angegeben werden. Diese Unterstützung wird von der x:TypeArguments-Direktive bereitgestellt, die die einschränkenden Typargumente eines generischen Typs an den Konstruktor des generischen Typs übergibt.

Typargumente werden als Zeichenfolge angegeben und werden in der Regel präfixiert, z. B. sys:String und sys:Int32. Präfixierung ist erforderlich, da die typischen Typen generischer CLR-Einschränkungen aus Bibliotheken stammen, die nicht den standardmäßigen .NET MAUI-Namespaces zugeordnet sind. Die integrierten XAML 2009-Typen wie x:String und x:Int32können jedoch auch als Typargumente angegeben werden, wobei x der XAML-Sprachnamespace für XAML 2009 ist. Weitere Informationen zu den integrierten XAML 2009-Typen finden Sie unter XAML 2009-Sprachgrundtypen.

Wichtig

Das Definieren generischer Typen in .NET MAUI XAML mit der x:TypeArguments-Direktive wird nicht unterstützt.

Mehrere Typargumente können mithilfe eines Kommastrennzeichens angegeben werden. Wenn eine generische Einschränkung generische Typen verwendet, sollten die geschachtelten Einschränkungstypargumente in Klammern enthalten sein.

Anmerkung

Die x:Type-Markuperweiterung stellt einen ClR-Typverweis (Common Language Runtime) für einen generischen Typ bereit und hat eine ähnliche Funktion wie der typeof-Operator in C#. Weitere Informationen finden Sie unter x:Type-Markuperweiterung.

Informationen zum Angeben generischer Typen in .NET MAUI XAML mit den Direktiven x:DataType und x:Type finden Sie unter Kompilierungsbindungen, die einen generischen Typ und x:Type-Markuperweiterungangeben.

Argument für einen einfachen Grundtyp

Ein einzelnes Grundtypargument kann mithilfe der x:TypeArguments-Direktive als präfixiertes Zeichenfolgenargument angegeben werden:

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

In diesem Beispiel wird System.Collections.Generic als scg XAML-Namespace definiert. Die CollectionView.ItemsSource-Eigenschaft wird auf eine List<T> festgelegt, die mit einem string Typargument instanziiert wird, wobei der integrierte XAML 2009-x:String-Typ verwendet wird. Die List<string>-Sammlung wird mit mehreren string-Elementen initialisiert.

Alternativ, aber gleichwertig, kann die List<T>-Auflistung mit dem CLR-String-Typ instanziiert werden.

<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 "Einzelner Objekttyp"

Ein einzelnes Objekttypargument kann mithilfe der x:TypeArguments-Direktive als präfixiertes Zeichenfolgenargument angegeben werden:

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

In diesem Beispiel wird GenericsDemo.Models als models XAML-Namespace definiert, und System.Collections.Generic wird als scg XAML-Namespace definiert. Die CollectionView.ItemsSource-Eigenschaft wird auf eine List<T> festgelegt, die mit einem Monkey-Typargument instanziiert wird. Die List<Monkey>-Auflistung wird mit mehreren Monkey Elementen initialisiert, und ein DataTemplate, der die Darstellung jedes Monkey Objekts definiert, wird als ItemTemplate des CollectionViewfestgelegt.

Mehrere Typargumente

Mehrere Typargumente können als präfixierte Zeichenfolgenargumente angegeben werden, die durch ein Komma getrennt werden, wobei die x:TypeArguments-Direktive verwendet wird. Wenn eine generische Einschränkung generische Typen verwendet, sind die geschachtelten Einschränkungstypargumente in Klammern enthalten:

<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    

In diesem Beispiel wird GenericsDemo.Models als models XAML-Namespace definiert, und System.Collections.Generic wird als scg XAML-Namespace definiert. Die CollectionView.ItemsSource-Eigenschaft wird auf eine List<T> gesetzt, die mit einer KeyValuePair<TKey, TValue>-Beschränkung erzeugt wird, wobei die einschränkenden Typargumente string und Monkeysind. Die List<KeyValuePair<string,Monkey>>-Auflistung wird mit mehreren KeyValuePair Elementen initialisiert, wobei der nicht standardmäßige KeyValuePair-Konstruktor verwendet wird, und ein DataTemplate, der die Darstellung jedes Monkey Objekts definiert, wird als ItemTemplate des CollectionViewfestgelegt. Informationen zum Übergeben von Argumenten an einen nicht standardmäßigen Konstruktor finden Sie unter Übergeben von Konstruktorargumenten.