다음을 통해 공유


System.Type.MakeGenericType 메서드

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

MakeGenericType 메서드를 사용하면 특정 형식을 제네릭 형식 정의의 형식 매개 변수에 할당하는 코드를 작성하여 생성된 특정 형식을 Type 나타내는 개체를 만들 수 있습니다. 이 Type 개체를 사용하여 생성된 형식의 런타임 인스턴스를 만들 수 있습니다.

생성된 MakeGenericType 형식은 열 수 있습니다. 즉, 해당 형식 인수 중 일부는 제네릭 메서드 또는 형식을 묶는 형식 매개 변수일 수 있습니다. 동적 어셈블리를 내보낸 경우 이러한 개방형 생성 형식을 사용할 수 있습니다. 예를 들어 클래스 및 BaseDerived 다음 코드를 고려합니다.

public class Base<T, U> { }
public class Derived<V> : Base<int, V> { }
type Base<'T, 'U>() = class end
type Derived<'V>() = inherit Base<int, 'V>()
Public Class Base(Of T, U)
End Class
Public Class Derived(Of V)
    Inherits Base(Of Integer, V)
End Class

동적 어셈블리에서 생성 Derived 하려면 기본 형식을 생성해야 합니다. 이렇게 하려면 제네릭 형식 인수 Int32 및 형식 매개 변수 V 를 사용하여 클래스Base를 나타내는 개체에서 Derived메서드 Type 를 호출 MakeGenericType 합니다. 형식과 제네릭 형식 매개 변수는 모두 개체로 Type 표현되므로 두 매개 변수를 모두 포함하는 배열을 메서드에 MakeGenericType 전달할 수 있습니다.

참고 항목

생성된 Base<int, V> 형식은 코드를 내보낼 때 유용하지만 제네릭 형식 정의가 아니므로 이 형식에서 메서드를 호출 MakeGenericType 할 수 없습니다. 인스턴스화할 수 있는 닫힌 생성된 형식을 만들려면 먼저 메서드를 호출 GetGenericTypeDefinition 하여 Type 제네릭 형식 정의를 나타내는 개체를 만든 다음 원하는 형식 인수를 사용하여 호출 MakeGenericType 합니다.

Type 반환된 MakeGenericType 개체는 Type 생성된 생성된 형식의 메서드 또는 GetType 동일한 형식 인수를 사용하여 동일한 제네릭 형식 정의에서 생성된 생성된 형식의 메서드를 호출 GetType 하여 얻은 개체와 동일합니다.

참고 항목

제네릭 형식의 배열 자체는 제네릭 형식이 아닙니다. (Visual Basic에서)Dim ac() As C(Of T)와 같은 C<T>[] 배열 형식을 호출 MakeGenericType 할 수 없습니다. 닫힌 제네릭 형식을 C<T>[]생성하려면 제네릭 형식 정의를 C<T>가져오려면 호출 GetElementType 하고, 제네릭 형식 정의를 호출 MakeGenericType 하여 생성된 형식을 만들고, 마지막으로 생성된 형식의 메서드를 호출 MakeArrayType 하여 배열 형식을 만듭니다. 포인터 형식 및 ref 형식도 마찬가지입니다(ByRef Visual Basic의 경우).

제네릭 리플렉션에 사용되는 용어의 고정 조건 목록은 IsGenericType 속성 설명을 참조하세요.

중첩 형식

제네릭 형식이 C#, C++또는 Visual Basic을 사용하여 정의된 경우 중첩된 형식은 모두 제네릭입니다. 세 언어 모두 중첩 형식의 형식 매개 변수 목록에 바깥쪽 형식의 형식 매개 변수를 포함하므로 중첩된 형식에 고유한 형식 매개 변수가 없는 경우에도 마찬가지입니다. 다음 클래스를 고려합니다.

public class Outermost<T>
{
    public class Inner<U>
    {
        public class Innermost1<V> {}
        public class Innermost2 {}
    }
}
Public Class Outermost(Of T)
    Public Class Inner(Of U)
        Public Class Innermost1(Of V)
        End Class
        Public Class Innermost2
        End Class
    End Class
End Class

중첩 클래스 Inner 의 형식 매개 변수 목록에는 두 개의 형식 매개 변수가 있으며U, T 그 중 첫 번째는 바깥쪽 클래스의 형식 매개 변수입니다. 마찬가지로 중첩 클래스 Innermost1 의 형식 매개 변수 목록에는 3개의 형식 매개 변수, UVT 바깥쪽 클래스에서 들어오고 U 오는 세 가지 형식 매개 변수T가 있습니다. 중첩된 클래스 Innermost2 에는 두 개의 형식 매개 변수가 있으며U, T 이 매개 변수는 바깥쪽 클래스에서 가져옵니다.

바깥쪽 형식의 매개 변수 목록에 둘 이상의 형식 매개 변수가 있는 경우 순서대로 모든 형식 매개 변수가 중첩된 형식의 형식 매개 변수 목록에 포함됩니다.

중첩된 형식에 대한 제네릭 형식 정의에서 제네릭 형식을 생성하려면 가장 바깥쪽 제네릭 형식부터 시작하여 모든 바깥쪽 형식의 형식 인수 배열을 연결하고 자체 형식 매개 변수가 있는 경우 중첩된 형식 자체의 형식 인수 배열로 끝나는 배열을 사용하여 메서드를 호출 MakeGenericType 합니다. 인스턴스 Innermost1를 만들려면 T, U 및 V에 할당할 세 가지 형식을 포함하는 배열을 사용하여 메서드를 호출 MakeGenericType 합니다. 인스턴스 Innermost2를 만들려면 T 및 U에 할당할 두 가지 형식이 포함된 배열을 사용하여 메서드를 호출 MakeGenericType 합니다.

언어는 바깥쪽 형식의 형식 매개 변수를 사용하여 중첩된 형식의 필드를 정의할 수 있도록 이러한 방식으로 바깥쪽 형식의 형식 매개 변수를 전파합니다. 그렇지 않으면 형식 매개 변수가 중첩된 형식의 본문 내에서 범위에 포함되지 않습니다. 동적 어셈블리에서 코드를 내보내거나 IL 어셈블러(Ilasm.exe)를 사용하여 바깥쪽 형식의 형식 매개 변수를 전파하지 않고 중첩된 형식을 정의할 수 있습니다. CIL 어셈블러에 대해 다음 코드를 고려합니다.

.class public Outer<T> {
    .class nested public Inner<U> {
        .class nested public Innermost {
        }
    }
}

이 예제에서는 형식 매개 변수가 범위에 없기 때문에 형식 T 또는 U 클래스 Innermost의 필드를 정의할 수 없습니다. 다음 어셈블러 코드는 C++, Visual Basic 및 C#에 정의된 경우처럼 동작하는 중첩 클래스를 정의합니다.

.class public Outer<T> {
    .class nested public Inner<T, U> {
        .class nested public Innermost<T, U, V> {
        }
    }
}

Ildasm.exe(IL 디스어셈블러)를 사용하여 상위 수준 언어로 정의된 중첩 클래스를 검사하고 이 명명 체계를 관찰할 수 있습니다.