다음을 통해 공유


리플렉션 및 제네릭 형식

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

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

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

    비고

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

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

리플렉션은 형식 매개 변수의 배열에 액세스하고 인스턴스가 형식 매개 변수 또는 실제 형식을 나타내는지 여부를 Type 결정할 수 있는 메서드 MethodInfoType 를 제공합니다.

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

다음 설명에서는 형식 매개 변수와 인수 간의 차이, 개방형 또는 닫힌 생성 형식과 같은 제네릭 용어에 대해 잘 알고 있다고 가정합니다. 자세한 내용은 제네릭을 참조하세요.

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

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

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

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

제네릭 형식 및 메서드 정의는 인스턴스화 가능한 형식이 만들어지는 템플릿입니다. .NET 라이브러리의 제네릭 형식(예: Dictionary<TKey,TValue>제네릭 형식)은 제네릭 형식 정의입니다.

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

모든 바깥쪽 형식의 모든 형식 매개 변수를 포함하여 인스턴스화 가능한 형식이 모든 형식 매개 변수로 대체된 경우 제네릭 형식 또는 메서드가 닫힙니다. 제네릭 형식이 닫힌 경우에만 제네릭 형식의 인스턴스를 만들 수 있습니다. 형식이 Type.ContainsGenericParameters로 열린 경우 속성은 true를 반환합니다. MethodBase.ContainsGenericParameters 메서드는 동일한 기능을 수행합니다.

닫힌 제네릭 형식 생성

제네릭 형식이나 메서드 정의가 있으면 MakeGenericType 메서드를 사용하여 닫힌 제네릭 형식을 만들 수 있습니다. 닫힌 제네릭 메서드를 만들기 위해서는 MakeGenericMethod 메서드를 사용하고 이를 위해 MethodInfo가 필요합니다.

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

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

예를 들어, Type 객체가 Dictionary<int, string>를 나타내고, 타입 Dictionary<string, MyClass>을 만들고자 한다면, GetGenericTypeDefinition 메서드를 사용하여 Type를 나타내는 Dictionary<TKey, TValue>를 얻은 다음, MakeGenericType 메서드를 사용하여 Type를 나타내는 Dictionary<int, MyClass>를 생성할 수 있습니다.

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

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

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

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

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

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

제네릭 형식은 제네릭 형식 정의 없이 열 수 있으며, 이 경우 형식 인수와 형식 매개 변수가 혼합되어 있습니다. 예를 들어 다음 코드에서 클래스 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

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

제네릭 매개 변수의 원본

제네릭 형식 매개 변수는 검사하는 형식, 바깥쪽 형식 또는 제네릭 메서드에서 올 수 있습니다. 다음과 같이 제네릭 형식 매개 변수의 원본을 확인할 수 있습니다.

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

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

제네릭 매개 변수의 위치

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

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

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

제네릭 매개 변수 특성

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

공변성 및 반공변성

형식 매개 변수가 공변성인지 반공변성인지 확인하려면 GenericParameterAttributes.VarianceMask 속성에서 반환된 값 GenericParameterAttributesGenericParameterAttributes 마스크를 적용합니다. 결과가 GenericParameterAttributes.None이면, 형식 매개변수가 불변입니다. 자세한 내용은 공변성 및 반공변성(Contravariance)을 참조하세요.

특수 제약 조건

형식 매개 변수의 특수 제약 조건을 확인하려면 GenericParameterAttributes.SpecialConstraintMask 속성에서 반환되는 값에 GenericParameterAttributes 마스크를 GenericParameterAttributes 적용합니다. 결과가 있으면 GenericParameterAttributes.None특별한 제약 조건이 없습니다. 형식 매개 변수는 참조 형식, nullable이 아닌 값 형식 및 매개 변수가 없는 생성자로 제한될 수 있습니다.

불변성

제네릭 형식의 리플렉션에 사용되는 일반적인 용어에 대한 불변 조건의 테이블은 Type.IsGenericType을 참조하세요. 제네릭 메서드와 관련된 추가 용어는 다음을 참조하세요 MethodBase.IsGenericMethod.