제네릭

.NET 다중 플랫폼 앱 UI(.NET MAUI) XAML은 제네릭 제약 조건을 형식 인수로 지정하여 제네릭 CLR 형식을 사용할 수 있는 지원을 제공합니다. 이 지원은 제네릭의 제약 형식 인수를 제네릭 형식의 생성자에 전달하는 지시문에 의해 x:TypeArguments 제공됩니다.

형식 인수는 문자열로 지정되며 일반적으로 접두사(예: sys:Stringsys:Int32.)입니다. 일반적인 유형의 CLR 제네릭 제약 조건은 기본 .NET MAUI 네임스페이스에 매핑되지 않은 라이브러리에서 가져오므로 접두사 지정이 필요합니다. 그러나 XAML 2009와 같은 x:Stringx:Int32XAML 2009 기본 제공 형식은 XAML 2009의 XAML 언어 네임스페이스인 x 형식 인수로 지정할 수도 있습니다. XAML 2009 기본 제공 형식에 대한 자세한 내용은 XAML 2009 언어 기본 형식을 참조 하세요.

Important

지시문을 사용하여 .NET MAUI XAML에서 제네릭 클래스를 x:TypeArguments 정의하는 것은 지원되지 않습니다.

쉼표 구분 기호를 사용하여 여러 형식 인수를 지정할 수 있습니다. 또한 제네릭 제약 조건이 제네릭 형식을 사용하는 경우 중첩된 제약 조건 형식 인수는 괄호 안에 포함되어야 합니다.

참고 항목

태그 확장은 x:Type 제네릭 형식에 대한 CLR(공용 언어 런타임) 형식 참조를 제공하고 C#의 연산자와 유사한 함수를 typeof 포함합니다. 자세한 내용은 x:Type 태그 확장을 참조 하세요.

단일 기본 형식 인수

지시문을 사용하여 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>

이 예제에서는 System.Collections.Generic XAML 네임스페이 scg 스로 정의됩니다. 이 CollectionView.ItemsSource 속성은 XAML 2009 기본 제공 형식을 string 사용하여 형식 인수로 인스턴스화된 속성으로 설정 List<T> 됩니다x:String. List<string> 컬렉션은 여러 string 항목으로 초기화됩니다.

또는 CLR List<T>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>

단일 개체 형식 인수

지시문을 사용하여 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>

이 예제 GenericsDemo.Models 에서는 XAML 네임스페이스로 models 정의되며 System.Collections.Generic XAML 네임스페이 scg 스로 정의됩니다. 속성은 CollectionView.ItemsSource 형식 인수로 List<T> 인스턴스화된 속성으로 Monkey 설정됩니다. 컬렉션은 List<Monkey> 여러 Monkey 항목으로 초기화되고 DataTemplateMonkey 개체의 모양을 정의하는 컬렉션이 ItemTemplate />의 CollectionView형식으로 설정됩니다.

여러 형식 인수

여러 형식 인수는 지시문을 사용하여 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="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    

이 예제 GenericsDemo.Models 에서는 XAML 네임스페이스로 models 정의되며 System.Collections.Generic XAML 네임스페이 scg 스로 정의됩니다. 이 CollectionView.ItemsSource 속성은 내부 제약 조건 형식 인수 string 와 함께 KeyValuePair<TKey, TValue> 제약 조건으로 인스턴스화된 속성으로 설정 List<T> 됩니다Monkey. 컬렉션은 List<KeyValuePair<string,Monkey>> 기본 KeyValuePair 이 아닌 생성자를 사용하여 여러 KeyValuePair 항목으로 초기화되며 각 Monkey 개체의 모양을 정의하는 컬렉션은 DataTemplateItemTemplate/>의 CollectionView형식으로 설정됩니다. 기본이 아닌 생성자에 인수를 전달하는 방법에 대한 자세한 내용은 Pass 생성자 인수를 참조하세요.