Прочитать на английском

Поделиться через


Type.MakeGenericType(Type[]) Метод

Определение

Замещает элементы массива типов для параметров определения текущего универсального типа и возвращает объект Type, представляющий сконструированный результирующий тип.

public abstract Type MakeGenericType(params Type[] typeArguments);
public virtual Type MakeGenericType(params Type[] typeArguments);

Параметры

typeArguments
Type[]

Массив типов, который должен быть замещен параметрами типа текущего универсального типа.

Возвращаемое значение

Type представляет сконструированный тип, сформированный путем замещения элементов объекта typeArguments параметрами текущего универсального типа.

Исключения

Текущий тип не представляет определение универсального типа. То есть IsGenericTypeDefinition возвращает false.

typeArguments имеет значение null.

-или-

Любой элемент typeArguments имеет значение null.

Количество элементов в typeArguments не совпадает с количеством параметров типа в текущем определении универсального типа.

-или-

Элементы typeArguments не соответствуют ограничениям, указанным для соответствующего параметра типа текущего определения универсального типа.

-или-

typeArguments содержит элемент, который является типом указателя (IsPointer возвращает true), типом доступа по ссылке (IsByRef возвращает true) или Void.

Вызванный метод не поддерживается в базовом классе. Реализацию должны обеспечивать производные классы.

Примеры

В следующем примере метод используется MakeGenericType для создания сконструированного типа на основе определения универсального Dictionary<TKey,TValue> типа для типа. Сконструированный тип представляет Dictionary<TKey,TValue> объект объектов Test со строковыми ключами.

using System;
using System.Reflection;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        Console.WriteLine("\r\n--- Create a constructed type from the generic Dictionary type.");

        // Create a type object representing the generic Dictionary 
        // type, by omitting the type arguments (but keeping the 
        // comma that separates them, so the compiler can infer the
        // number of type parameters).      
        Type generic = typeof(Dictionary<,>);
        DisplayTypeInfo(generic);

        // Create an array of types to substitute for the type
        // parameters of Dictionary. The key is of type string, and
        // the type to be contained in the Dictionary is Test.
        Type[] typeArgs = { typeof(string), typeof(Test) };

        // Create a Type object representing the constructed generic
        // type.
        Type constructed = generic.MakeGenericType(typeArgs);
        DisplayTypeInfo(constructed);

        // Compare the type objects obtained above to type objects
        // obtained using typeof() and GetGenericTypeDefinition().
        Console.WriteLine("\r\n--- Compare types obtained by different methods:");

        Type t = typeof(Dictionary<String, Test>);
        Console.WriteLine("\tAre the constructed types equal? {0}", t == constructed);
        Console.WriteLine("\tAre the generic types equal? {0}", 
            t.GetGenericTypeDefinition() == generic);
    }

    private static void DisplayTypeInfo(Type t)
    {
        Console.WriteLine("\r\n{0}", t);

        Console.WriteLine("\tIs this a generic type definition? {0}", 
            t.IsGenericTypeDefinition);

        Console.WriteLine("\tIs it a generic type? {0}", 
            t.IsGenericType);

        Type[] typeArguments = t.GetGenericArguments();
        Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
        foreach (Type tParam in typeArguments)
        {
            Console.WriteLine("\t\t{0}", tParam);
        }
    }
}

/* This example produces the following output:

--- Create a constructed type from the generic Dictionary type.

System.Collections.Generic.Dictionary`2[TKey,TValue]
        Is this a generic type definition? True
        Is it a generic type? True
        List type arguments (2):
                TKey
                TValue

System.Collections.Generic.Dictionary`2[System.String, Test]
        Is this a generic type definition? False
        Is it a generic type? True
        List type arguments (2):
                System.String
                Test

--- Compare types obtained by different methods:
        Are the constructed types equal? True
        Are the generic types equal? True
 */

Комментарии

Дополнительные сведения об этом API см. в разделе Дополнительные примечания API для Type.MakeGenericType.

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел