리플렉션 및 제네릭 형식

리플렉션의 관점에서 제네릭 형식과 일반 형식의 차이점은 제네릭 형식이 형식 매개 변수 집합(제네릭 형식 정의인 경우) 또는 형식 인수(생성된 형식인 경우)와 연결되었다는 것입니다. 제네릭 메서드는 동일한 방식으로 일반 메서드와 다릅니다.

다음과 같이 리플렉션이 제네릭 형식 및 메서드를 처리하는 방법을 이해하기 위한 두 가지 키가 있습니다.

  • 제네릭 형식 정의 및 제네릭 메서드 정의의 형식 매개 변수는 Type 클래스의 인스턴스로 표현됩니다.

    참고 항목

    Type 의 여러 속성 및 메서드는 Type 개체가 제네릭 형식 매개 변수를 나타낼 때 다른 동작을 내포합니다. 이러한 차이점은 속성 및 메서드 문서에 설명되어 있습니다. 예제는 IsAutoClassDeclaringType을 참조하세요. 또한 일부 멤버는 Type 개체가 제네릭 형식 매개 변수를 나타낼 경우에만 유효합니다. 예를 들어 GetGenericTypeDefinition를 참조하세요.

  • Type 의 인스턴스가 제네릭 형식을 나타내면 형식 매개 변수(제네릭 형식 정의의 경우) 또는 형식 인수(생성된 형식의 경우)를 나타내는 형식의 배열이 포함됩니다. 제네릭 메서드를 나타내는 MethodInfo 클래스의 인스턴스에서도 똑같습니다.

리플렉션은 TypeMethodInfo의 메서드를 제공합니다. 이 메서드를 통해 형식 매개 변수의 배열에 액세스할 수 있으며, Type의 인스턴스가 형식 매개 변수를 나타내는지 또는 실제 형식을 나타내는지 확인할 수 있습니다.

여기에서 논의한 메서드를 보여 주는 예제 코드는 방법: 리플렉션을 사용하여 제네릭 형식 검사 및 인스턴스화를 참조하세요.

다음 논의에서는 형식 매개 변수 및 인수와 개방형 또는 폐쇄형의 생성된 형식 간 차이점과 같은 제네릭 용어에 익숙하다고 가정합니다. 자세한 내용은 제네릭을 참조하세요.

제네릭 형식 또는 메서드인가요?

리플렉션을 사용하여 Type의 인스턴스에서 나타내는 알 수 없는 형식을 검사할 때 알 수 없는 형식이 제네릭인지 여부를 확인하는 데 IsGenericType 속성을 사용합니다. 형식이 제네릭 경우 true 를 반환합니다. 마찬가지로 리플렉션을 사용하여 MethodInfo 클래스의 인스턴스에서 나타내는 알 수 없는 메서드를 검사할 때 메서드가 제네릭인지 여부를 확인하는 데 IsGenericMethod 속성을 사용합니다.

제네릭 형식 또는 메서드 정의인가요?

IsGenericTypeDefinition 속성을 사용하여 Type 개체가 제네릭 형식 정의를 나타내는지를 확인하고, IsGenericMethodDefinition 메서드를 사용하여 MethodInfo 개체가 제네릭 메서드 정의를 나타내는지를 확인합니다.

제네릭 형식 및 메서드 정의는 인스턴스화할 수 있는 형식을 생성하는 템플릿입니다. .NET 라이브러리의 제네릭 형식(예: Dictionary<TKey,TValue>제네릭 형식)은 제네릭 형식 정의입니다.

형식 또는 메서드가 열려 있거나 닫혀 있나요?

인스턴스화할 수 있는 형식이 모든 바깥쪽 형식의 모든 형식 매개 변수를 비롯하여 모든 해당 형식 매개 변수를 대체한 경우 제네릭 형식 또는 메서드는 폐쇄형입니다. 제네릭 형식이 닫힌 경우에만 제네릭 형식의 인스턴스를 만들 수 있습니다. 형식이 개방형인 경우 Type.ContainsGenericParameters 속성에서 true 를 반환합니다. 메서드의 경우 MethodBase.ContainsGenericParameters 메서드가 같은 기능을 수행합니다.

닫힌 제네릭 형식 생성

제네릭 형식 또는 메서드 정의가 있으면 MakeGenericType 메서드를 사용하여 폐쇄형 제네릭 형식을 만들거나 MakeGenericMethod 메서드를 사용하여 폐쇄형 제네릭 형식의 MethodInfo 를 만듭니다.

제네릭 형식 또는 메서드 정의 가져오기

제네릭 형식 또는 메서드 정의가 아닌 개방형 제네릭 형식 또는 메서드가 있는 경우 인스턴스를 만들 수 없으며 누락된 형식 매개 변수를 제공할 수 없습니다. 제네릭 형식 또는 메서드 정의가 있어야 합니다. GetGenericTypeDefinition 메서드를 사용하여 제네릭 형식 정의를 가져오거나 GetGenericMethodDefinition 메서드를 사용하여 제네릭 메서드 정의를 가져옵니다.

예를 들어 나타내는 개체가 Type 있고 형식Dictionary<string, MyClass>을 만들려는 경우 이 메서드를 사용하여 GetGenericTypeDefinition 표현을 Dictionary<TKey, TValue> 가져와 Type 서 해당 메서드를 사용하여 MakeGenericType 표현을 Dictionary<int, MyClass>생성 Type 할 수 있습니다.Dictionary<int, string>

제네릭 형식이 아닌 열린 제네릭 형식의 예는 Type 매개 변수 또는 형식 인수를 참조하세요.

형식 인수 및 형식 매개 변수 검사

Type.GetGenericArguments 메서드를 사용하여 제네릭 형식의 형식 매개 변수 또는 형식 인수를 나타내는 Type 개체의 배열을 가져오고, MethodInfo.GetGenericArguments 메서드를 사용하여 제네릭 메서드에 대해 동일한 작업을 수행합니다.

Type 개체가 형식 매개 변수를 나타내는 것을 알고 있다면 리플렉션이 대답할 수 있는 추가 질문이 많습니다. 형식 매개 변수의 소스, 해당 위치 및 해당 제약 조건을 확인할 수 있습니다.

형식 매개 변수 또는 형식 인수

배열의 특정 요소가 형식 매개 변수인지 또는 형식 인수인지 확인하려면 IsGenericParameter 속성을 사용합니다. 요소가 형식 매개 변수인 경우 IsGenericParameter 속성은 true 입니다.

제네릭 형식은 제네릭 형식 정의 없이 열릴 수 있으며, 이 경우에 형식 인수 및 형식 매개 변수가 혼합됩니다. 예를 들어 다음 코드에서 D 클래스는 D 의 첫 번째 형식 매개 변수로 B의 두 번째 형식 매개 변수를 대체하여 생성한 형식에서 파생됩니다.

class B<T, U> {}
class D<V, W> : B<int, V> {}
Class B(Of T, U)
End Class
Class D(Of V, W)
    Inherits B(Of Integer, V)
End Class
generic<typename T, typename U> ref class B {};
generic<typename V, typename W> ref class D : B<int, V> {};

나타내는 개체를 TypeD<V, W> 가져오고 속성을 사용하여 BaseType 기본 형식을 가져오는 경우 결과는 type B<int, V> 열려 있지만 제네릭 형식 정의는 아닙니다.

제네릭 매개 변수의 원본

제네릭 형식 매개 변수는 검사 중인 형식, 바깥쪽 형식 또는 제네릭 메서드에서 가져올 수 있습니다. 다음과 같이 제네릭 형식 매개 변수의 소스를 확인할 수 있습니다.

  • 먼저, DeclaringMethod 속성을 사용하여 형식 매개 변수가 제네릭 메서드에서 가져온 것인지 확인합니다. 속성 값이 null 참조가 아닌 경우 원본은 제네릭 메서드입니다.
  • 소스가 제네릭 메서드가 아닌 경우 DeclaringType 속성을 사용하여 제네릭 형식 매개 변수가 속한 제네릭 형식을 확인합니다.

형식 매개 변수가 제네릭 메서드에 속한 경우 DeclaringType 속성은 관련이 없는 제네릭 메서드를 선언한 형식을 반환합니다.

제네릭 매개 변수의 위치

드문 경우이지만 선언 클래스의 형식 매개 변수 목록에서 형식 매개 변수의 위치를 확인해야 합니다. 예를 들어 앞의 예제에서 Type 형식을 나타내는 B<int, V> 개체가 있다고 가정합니다. GetGenericArguments 메서드는 형식 인수의 목록을 제공하므로 V 를 검사할 경우 DeclaringMethodDeclaringType 속성을 사용하여 어디에서 가져왔는지 검색할 수 있습니다. 그런 다음 GenericParameterPosition 속성을 사용하여 원래 정의된 형식 매개 변수 목록에서 해당 위치를 확인할 수 있습니다. 이 예제에서 V 는 원래 정의된 형식 매개 변수 목록에서 0(영) 위치에 있습니다.

기본 형식 및 인터페이스 제약 조건

GetGenericParameterConstraints 메서드를 사용하여 형식 매개 변수의 기본 형식 제약 조건 및 인터페이스 제약 조건을 가져옵니다. 배열 요소의 순서는 중요하지 않습니다. 요소가 인터페이스 형식인 경우 인터페이스 제약 조건을 나타냅니다.

제네릭 매개 변수 특성

GenericParameterAttributes 속성은 형식 매개 변수의 분산(공 분산 및 반공 분산) 및 특별 제약 조건을 나타내는 GenericParameterAttributes 값을 가져옵니다.

공변성(Covariance) 및 반공변성(Contravariance)

형식 매개 변수가 공 분산인지 또는 반공 분산인지 확인하려면 GenericParameterAttributes.VarianceMask 마스크를 GenericParameterAttributes 속성에서 반환한 GenericParameterAttributes 값에 적용합니다. 결과가 GenericParameterAttributes.None인 경우 형식 매개 변수는 고정입니다. 자세한 내용은 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.

특수 제약 조건

형식 매개 변수의 특별 제약 조건을 확인하려면 GenericParameterAttributes.SpecialConstraintMask 마스크를 GenericParameterAttributes 속성에서 반환한 GenericParameterAttributes 값에 적용합니다. 결과가 GenericParameterAttributes.None인 경우 특별 제약 조건이 없습니다. 형식 매개 변수는 참조 형식이어야 하고 Nullable이 아닌 값 형식이어야 하며 그리고 매개 변수가 없는 생성자를 보유해야 하는 제약을 받습니다.

고정

제네릭 형식에 대한 리플렉션의 일반적인 용어에 대한 고정 조건 표는 Type.IsGenericType을 참조하세요. 제네릭 메서드와 관련된 추가 용어는 MethodBase.IsGenericMethod를 참조하세요.