리플렉션 관점에서 볼 때 제네릭 형식과 일반 형식의 차이점은 제네릭 형식이 형식 매개 변수(제네릭 형식 정의인 경우)나 형식 인수(생성된 형식인 경우)의 집합과 관련이 있다는 점입니다. 제네릭 메서드는 같은 방식으로 일반 메서드와 차이가 있습니다.
다음은 리플렉션이 제네릭 형식과 메서드를 처리하는 방법을 이해하기 위한 두 가지 핵심 사항입니다.
제네릭 형식 정의와 제네릭 메서드 정의의 형식 매개 변수는 Type 클래스의 인스턴스로 표시됩니다.
참고
Type 개체가 제네릭 형식 매개 변수를 나타내는 경우 Type의 다양한 속성과 메서드는 서로 다른 동작을 나타냅니다.이러한 차이점은 속성 항목과 메서드 항목에서 설명합니다.예를 들어, IsAutoClass 및 DeclaringType을 참조하십시오.또한 일부 멤버는 Type 개체가 제네릭 형식 매개 변수를 나타낼 때만 유효합니다.예제를 보려면 GetGenericTypeDefinition을 참조하십시오.
Type의 인스턴스가 제네릭 형식을 나타내는 경우 이 인스턴스에는 형식 매개 변수(제네릭 형식 정의의 경우) 또는 형식 인수(생성된 형식의 경우)를 나타내는 형식의 배열이 포함됩니다. 이는 제네릭 메서드를 나타내는 MethodInfo 클래스의 인스턴스에도 적용됩니다.
리플렉션은 형식 매개 변수의 배열에 액세스할 수 있고 Type의 인스턴스가 형식 매개 변수 또는 실제 형식을 나타내는지 여부를 확인할 수 있는 Type 및 MethodInfo 메서드를 제공합니다.
여기서 설명하는 메서드를 보여 주는 예제 코드는 방법: 리플렉션을 사용하여 제네릭 형식 검사 및 인스턴스화를 참조하십시오.
다음 설명을 이해하려면 형식 매개 변수 및 인수와 개방형 생성 형식 또는 폐쇄형 생성 형식 간의 차이점과 같은 제네릭 용어에 대해 잘 알고 있어야 합니다. 자세한 내용은 .NET Framework의 제네릭을 참조하십시오.
이 개요는 다음과 같은 단원으로 구성됩니다.
이것은 제네릭 형식입니까 또는 메서드입니까?
닫힌 제네릭 형식 생성
형식 인수 및 형식 매개 변수 검사
고정 조건
관련 항목
이것은 제네릭 형식입니까 또는 메서드입니까?
리플렉션을 사용하여 Type의 인스턴스로 표시되는 알 수 없는 형식을 검사하는 경우 IsGenericType 속성을 사용하여 알 수 없는 해당 형식이 제네릭인지 여부를 확인합니다. 해당 형식이 제네릭이면 true가 반환됩니다. 마찬가지로 MethodInfo 클래스의 인스턴스로 표시되는 알 수 없는 메서드를 검사하는 경우 IsGenericMethod 속성을 사용하여 해당 메서드가 제네릭인지 여부를 확인합니다.
이것은 제네릭 형식입니까 또는 메서드 정의입니까?
Type 개체가 제네릭 형식 정의를 나타내는지 여부를 확인하려면 IsGenericTypeDefinition 속성을 사용하고 MethodInfo가 제네릭 메서드 정의를 나타내는지 여부를 확인하려면 IsGenericMethodDefinition 메서드를 사용합니다.
제네릭 형식 및 메서드 정의는 인스턴스화할 수 있는 형식이 만들어지는 템플릿입니다. Dictionary<TKey, TValue>와 같은 .NET Framework 클래스 라이브러리의 제네릭 형식은 제네릭 형식 정의입니다.
형식 또는 메서드가 열려 있습니까 또는 닫혀 있습니까?
모든 바깥쪽 형식의 모든 형식 매개 변수를 포함하여 모든 해당 형식 매개 변수가 인스턴스화할 수 있는 형식으로 대체된 경우 제네릭 형식 또는 메서드가 닫힙니다. 제네릭 형식의 인스턴스는 해당 형식이 닫혀 있는 경우에만 만들 수 있습니다. 형식이 열려 있는 경우 Type.ContainsGenericParameters 속성은 true를 반환합니다. 메서드의 경우 MethodInfo.ContainsGenericParameters 메서드는 동일한 기능을 수행합니다.
맨 위로 이동
닫힌 제네릭 형식 생성
제네릭 형식 또는 메서드 정의가 있는 경우 MakeGenericType 메서드를 사용하여 닫힌 제네릭 형식을 만들거나 MakeGenericMethod 메서드를 사용하여 닫힌 제네릭 메서드에 대한 MethodInfo를 만듭니다.
제네릭 형식 또는 메서드 정의 가져오기
제네릭 형식 또는 메서드 정의가 아닌 열린 제네릭 형식이나 메서드가 있는 경우 해당 인스턴스를 만들 수 없으며 누락된 형식 매개 변수를 제공할 수 없습니다. 제네릭 형식 또는 메서드 정의가 필요합니다. 제네릭 형식 정의를 가져오려면 GetGenericTypeDefinition 메서드를 사용하고 제네릭 메서드 정의를 가져오려면 GetGenericMethodDefinition 메서드를 사용합니다.
예를 들어, Dictionary<int, string>(Visual Basic의 경우 Dictionary(Of Integer, String))를 나타내는 Type 개체가 있고 Dictionary<string, MyClass> 형식을 만들려는 경우 GetGenericTypeDefinition 메서드를 사용하여 Dictionary<TKey, TValue>를 나타내는 Type을 가져온 다음 MakeGenericType 메서드를 사용하여 Dictionary<int, MyClass>를 나타내는 Type을 생성할 수 있습니다.
제네릭 형식이 아닌 열린 제네릭 형식의 예제를 보려면 이 항목의 뒷부분에 나오는 "형식 매개 변수 또는 형식 인수"를 참조하십시오.
맨 위로 이동
형식 인수 및 형식 매개 변수 검사
제네릭 형식의 형식 매개 변수 또는 형식 인수를 나타내는 Type 개체의 배열을 가져오려면 Type.GetGenericArguments 메서드를 사용하고 제네릭 메서드에 이와 동일한 작업을 수행하려면 MethodInfo.GetGenericArguments 메서드를 사용합니다.
Type 개체가 형식 매개 변수를 나타내는 경우 리플렉션에서 대답할 수 있는 질문이 더 많이 있습니다. 즉, 형식 매개 변수의 소스, 해당 위치 및 해당 제약 조건을 확인할 수 있습니다.
형식 매개 변수 또는 형식 인수
배열의 특정 요소가 형식 매개 변수 또는 형식 인수인지 여부를 확인하려면 IsGenericParameter 속성을 사용합니다. 해당 요소가 형식 매개 변수인 경우 IsGenericParameter 속성은 true입니다.
제네릭 형식은 제네릭 형식 정의가 아니어도 열린 상태일 수 있으며 이 경우 형식 인수와 형식 매개 변수가 혼합되어 있습니다. 예를 들어, 다음 코드에서는 첫 번째 형식 매개 변수인 D가 두 번째 형식 매개 변수인 B를 대체하여 만들어진 형식에서 D 클래스가 파생됩니다.
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> {};
D<V, W>를 나타내는 Type 개체를 가져오고 BaseType 속성을 사용하여 해당 기본 형식을 가져오는 경우 결과 type B<int, V>은 열려 있지만 제네릭 형식 정의는 아닙니다.
제네릭 매개 변수의 소스
제네릭 형식 매개 변수는 사용자가 검사하는 형식, 바깥쪽 형식 또는 제네릭 메서드에서 가져올 수 있습니다. 이러한 제네릭 형식 매개 변수의 소스는 다음과 같이 확인할 수 있습니다.
먼저 DeclaringMethod 속성을 사용하여 형식 매개 변수를 제네릭 메서드에서 가져오는지 여부를 확인합니다. 속성 값이 null 참조(Visual Basic의 경우 Nothing)가 아닌 경우 해당 소스는 제네릭 메서드입니다.
소스가 제네릭 메서드가 아닌 경우 DeclaringType 속성을 사용하여 제네릭 형식 매개 변수가 속하는 제네릭 형식을 확인합니다.
형식 매개 변수가 제네릭 메서드에 속하는 경우 DeclaringType 속성은 관련이 없는 제네릭 메서드를 선언한 형식을 반환합니다.
제네릭 매개 변수의 위치
드문 경우이기는 하지만 해당 선언 클래스의 형식 매개 변수 목록에서 형식 매개 변수의 위치를 확인해야 하는 경우가 있습니다. 예를 들어, 앞의 예제에서 B<int, V> 형식을 나타내는 Type 개체가 있는 것으로 가정합니다. GetGenericArguments 메서드는 형식 인수의 목록을 제공하며, V를 검사할 때 DeclaringMethod 및 DeclaringType 속성을 사용하여 해당 소스를 확인할 수 있습니다. 그런 다음 GenericParameterPosition 속성을 사용하여 정의된 형식 매개 변수 목록에서의 해당 위치를 확인할 수 있습니다. 이 예제에서 정의된 형식 매개 변수 목록에서의 V의 위치는 0입니다.
기본 형식 및 인터페이스 제약 조건
형식 매개 변수의 기본 형식 제약 조건과 인터페이스 제약 조건을 가져오려면 GetGenericParameterConstraints 메서드를 사용합니다. 배열 요소의 순서는 중요하지 않습니다. 요소가 인터페이스 형식인 경우 인터페이스 제약 조건을 나타냅니다.
제네릭 매개 변수 특성
GenericParameterAttributes 속성은 공 분산 또는 반공변성(Contravariance)이라는 가변성(variance) 및 형식 매개 변수의 특수 제약 조건을 나타내는 GenericParameterAttributes 값을 가져옵니다.
공 분산 및 반공변성(Contravariance)
형식 매개 변수가 공변(covariant)인지 아니면 반공변(contravariant)인지 여부를 확인하려면 GenericParameterAttributes 속성에서 반환하는 GenericParameterAttributes 값에 GenericParameterAttributes.VarianceMask 마스크를 적용합니다. 결과가 GenericParameterAttributes.None이면 형식 매개 변수는 invariant입니다. 제네릭의 공변성(Covariance)과 반공변성(Contravariance)를 참조하십시오.
특수 제약 조건
형식 매개 변수의 특수 제약 조건을 확인하려면 GenericParameterAttributes 속성에서 반환하는 GenericParameterAttributes 값에 GenericParameterAttributes.SpecialConstraintMask 마스크를 적용합니다. 결과가 GenericParameterAttributes.None이면 특수 제약 조건이 없는 것입니다. 형식 매개 변수는 nullable이 아닌 값 형식의 참조 형식으로 제한될 수 있으며 기본 생성자를 갖도록 제한될 수 있습니다.
맨 위로 이동
고정 조건
제네릭 형식에 대한 일반적인 리플렉션 용어의 고정 조건 테이블을 보려면 Type.IsGenericType을 참조하십시오. 제네릭 메서드와 관련된 추가 용어를 보려면 MethodInfo.IsGenericMethod를 참조하십시오.
맨 위로 이동
관련 항목
제목 |
설명 |
---|---|
Type 및 MethodInfo의 속성과 메서드를 사용하여 제네릭 형식을 검사하는 방법을 보여 줍니다. |
|
제네릭 기능 및 .NET Framework에서 제네릭 기능이 지원되는 방법에 대해 설명합니다. |
|
리플렉션 내보내기를 사용하여 동적 어셈블리에서 제네릭 형식을 생성하는 방법을 보여 줍니다. |
|
Type 클래스에 대해 설명하고, Type과 여러 reflection 클래스를 사용하여 생성자, 메서드, 필드, 속성 및 이벤트에 대한 정보를 얻는 방법을 보여 주는 코드 예제를 제공합니다. |
맨 위로 이동