about_Calling_Generic_Methods

Typy ogólne umożliwiają dostosowanie metody, klasy, struktury lub interfejsu do dokładnego typu danych, na którym działa. Na przykład zamiast używać Hashtable klasy , która umożliwia używanie kluczy i wartości dowolnego typu, można użyć Dictionary<TKey,TValue> klasy ogólnej i określić typy dozwolone dla właściwości klucza i wartości . Typy ogólne zapewniają zwiększoną możliwość ponownego użytkowania kodu i bezpieczeństwo typów.

W przypadku niektórych metod ogólnych program PowerShell może ustalić ogólne argumenty dla metody, wywnioskując z podanych argumentów. Jednak rozpoznawanie metody może być skomplikowane, gdy metoda ma zarówno przeciążenia ogólne, jak i nieogólne, lub gdy metoda ogólna nie przyjmuje parametru formalnego. Program PowerShell może nie rozpoznać poprawnej metody bez jawnych argumentów metody ogólnej.

Na przykład [Array]::Empty<T>(). Klasa .NET Array ma statyczną, ogólną metodę Empty<T>() , która nie przyjmuje parametrów formalnych.

Przed programem PowerShell 7.3 w celu zapewnienia prawidłowego rozwiązania metody trzeba było użyć skomplikowanych obejść przy użyciu odbicia platformy .NET. Aby zapoznać się z przykładem, zobacz wpis w blogu Lee Holmes dotyczący wywoływania metod ogólnych w klasach niegenerycznych w programie PowerShell.

Począwszy od programu PowerShell 7.3, można określić typy dla metody ogólnej.

Składnia

Metoda ogólna jest metodą z dwiema listami parametrów: listą typów ogólnych i listą argumentów metody.

W poniższych przykładach przedstawiono nową składnię programu PowerShell na potrzeby uzyskiwania dostępu do metody ogólnej:

# static generic methods
[type_name]::MethodName[generic_type_arguments](method_arguments)

# instance generic methods
$object.MethodName[generic_type_arguments](method_arguments)

Może generic_type_arguments to być pojedyncza lub rozdzielona przecinkami lista typów, takich jak , w tym inne typy ogólne, takie jak [string, int]$obj.MethodName[string, System.Collections.Generic.Dictionary[string, int]]()

Może method_arguments to być zero lub więcej elementów.

Aby uzyskać więcej informacji, zobacz Generics in .NET (Typy ogólne na platformie .NET).

Przykład

W tym przykładzie utworzymy listę liczb całkowitych, a następnie użyjemy System.Linq.Enumerable klasy , aby wyliczyć wartości i przekształcić je w nową wartość.

Zmienna $list jest obiektem ogólnym List<T> , który może zawierać tylko liczby całkowite. List<T> jest klasą ogólną, która umożliwia określenie typu jego składowych podczas jego tworzenia. [System.Linq.Enumerable]::Select<T1,T2>(T1,T2) jest metodą ogólną, która wymaga dwóch parametrów typu ogólnego i dwóch parametrów wartości formalnej.

[System.Collections.Generic.List[int]]$list = @( 1, 2, 3, 4, 5 )
$result = [System.Linq.Enumerable]::Select[int, float](
    $list,
    [Func[int, float]]{
        param($item)
        [math]::Pow($item, 3)
    }
)
$result

Dane wyjściowe pokazują każdą wartość podniesioną do potęgi 3.

1
8
27
64
125