리플렉션 및 제네릭 형식Reflection and Generic Types

리플렉션의 관점에서 제네릭 형식과 일반 형식 간 차이점은 제네릭 형식이 형식 매개 변수(제네릭 형식 정의인 경우) 또는 형식 인수(생성된 형식인 경우)의 집합과 연결되어 있다는 점입니다.From the point of view of reflection, the difference between a generic type and an ordinary type is that a generic type has associated with it a set of type parameters (if it is a generic type definition) or type arguments (if it is a constructed type). 제네릭 메서드는 동일한 방식으로 일반 메서드와 다릅니다.A generic method differs from an ordinary method in the same way.

다음과 같이 리플렉션이 제네릭 형식 및 메서드를 처리하는 방법을 이해하기 위한 두 가지 키가 있습니다.There are two keys to understanding how reflection handles generic types and methods:

  • 제네릭 형식 정의 및 제네릭 메서드 정의의 형식 매개 변수는 Type 클래스의 인스턴스로 표현됩니다.The type parameters of generic type definitions and generic method definitions are represented by instances of the Type class.

    참고

    Type 의 여러 속성 및 메서드는 Type 개체가 제네릭 형식 매개 변수를 나타낼 때 다른 동작을 내포합니다.Many properties and methods of Type have different behavior when a Type object represents a generic type parameter. 이러한 차이는 속성 및 메서드 항목에 설명되어있습니다.These differences are documented in the property and method topics. 예제는 IsAutoClassDeclaringType을 참조하세요.For example, see IsAutoClass and DeclaringType. 또한 일부 멤버는 Type 개체가 제네릭 형식 매개 변수를 나타낼 경우에만 유효합니다.In addition, some members are valid only when a Type object represents a generic type parameter. 예제는 GetGenericTypeDefinition을 참조하세요.For example, see GetGenericTypeDefinition.

  • Type 의 인스턴스가 제네릭 형식을 나타내면 형식 매개 변수(제네릭 형식 정의의 경우) 또는 형식 인수(생성된 형식의 경우)를 나타내는 형식의 배열이 포함됩니다.If an instance of Type represents a generic type, then it includes an array of types that represent the type parameters (for generic type definitions) or the type arguments (for constructed types). 제네릭 메서드를 나타내는 MethodInfo 클래스의 인스턴스에서도 똑같습니다.The same is true of an instance of the MethodInfo class that represents a generic method.

리플렉션은 TypeMethodInfo의 메서드를 제공합니다. 이 메서드를 통해 형식 매개 변수의 배열에 액세스할 수 있으며, Type의 인스턴스가 형식 매개 변수를 나타내는지 또는 실제 형식을 나타내는지 확인할 수 있습니다.Reflection provides methods of Type and MethodInfo that allow you to access the array of type parameters, and to determine whether an instance of Type represents a type parameter or an actual type.

여기에서 논의한 메서드를 보여 주는 예제 코드는 방법: 리플렉션을 사용하여 제네릭 형식 검사 및 인스턴스화를 참조하세요.For example code demonstrating the methods discussed here, see How to: Examine and Instantiate Generic Types with Reflection.

다음 논의에서는 형식 매개 변수 및 인수와 개방형 또는 폐쇄형의 생성된 형식 간 차이점과 같은 제네릭 용어에 익숙하다고 가정합니다.The following discussion assumes familiarity with the terminology of generics, such as the difference between type parameters and arguments and open or closed constructed types. 자세한 내용은 제네릭을 참조하세요.For more information, see Generics.

제네릭 형식인가요 아니면 제네릭 메서드인가요?Is This a Generic Type or Method?

리플렉션을 사용하여 Type의 인스턴스에서 나타내는 알 수 없는 형식을 검사할 때 알 수 없는 형식이 제네릭인지 여부를 확인하는 데 IsGenericType 속성을 사용합니다.When you use reflection to examine an unknown type, represented by an instance of Type, use the IsGenericType property to determine whether the unknown type is generic. 형식이 제네릭 경우 true 를 반환합니다.It returns true if the type is generic. 마찬가지로 리플렉션을 사용하여 MethodInfo 클래스의 인스턴스에서 나타내는 알 수 없는 메서드를 검사할 때 메서드가 제네릭인지 여부를 확인하는 데 IsGenericMethod 속성을 사용합니다.Similarly, when you examine an unknown method, represented by an instance of the MethodInfo class, use the IsGenericMethod property to determine whether the method is generic.

제네릭 형식인가요 아니면 메서드 정의인가요?Is This a Generic Type or Method Definition?

IsGenericTypeDefinition 속성을 사용하여 Type 개체가 제네릭 형식 정의를 나타내는지를 확인하고, IsGenericMethodDefinition 메서드를 사용하여 MethodInfo 개체가 제네릭 메서드 정의를 나타내는지를 확인합니다.Use the IsGenericTypeDefinition property to determine whether a Type object represents a generic type definition, and use the IsGenericMethodDefinition method to determine whether a MethodInfo represents a generic method definition.

제네릭 형식 및 메서드 정의는 인스턴스화할 수 있는 형식을 생성하는 템플릿입니다.Generic type and method definitions are the templates from which instantiable types are created. Dictionary<TKey,TValue>와 같은 .NET Framework 클래스 라이브러리의 제네릭 형식은 제네릭 형식 정의입니다.Generic types in the .NET Framework class library, such as Dictionary<TKey,TValue>, are generic type definitions.

형식 또는 메서드가 개방형인가요 아니면 폐쇄형인가요?Is the Type or Method Open or Closed?

인스턴스화할 수 있는 형식이 모든 바깥쪽 형식의 모든 형식 매개 변수를 비롯하여 모든 해당 형식 매개 변수를 대체한 경우 제네릭 형식 또는 메서드는 폐쇄형입니다.A generic type or method is closed if instantiable types have been substituted for all its type parameters, including all the type parameters of all enclosing types. 폐쇄형인 경우 제네릭 형식의 인스턴스만 만들 수 있습니다.You can only create an instance of a generic type if it is closed. 형식이 개방형인 경우 Type.ContainsGenericParameters 속성에서 true 를 반환합니다.The Type.ContainsGenericParameters property returns true if a type is open. 메서드의 경우 MethodBase.ContainsGenericParameters 메서드가 같은 기능을 수행합니다.For methods, the MethodBase.ContainsGenericParameters method performs the same function.

폐쇄형 제네릭 형식 생성Generating Closed Generic Types

제네릭 형식 또는 메서드 정의가 있으면 MakeGenericType 메서드를 사용하여 폐쇄형 제네릭 형식을 만들거나 MakeGenericMethod 메서드를 사용하여 폐쇄형 제네릭 형식의 MethodInfo 를 만듭니다.Once you have a generic type or method definition, use the MakeGenericType method to create a closed generic type or the MakeGenericMethod method to create a MethodInfo for a closed generic method.

제네릭 형식 또는 메서드 정의 가져오기Getting the Generic Type or Method Definition

제네릭 형식 또는 메서드 정의가 아닌 개방형 제네릭 형식 또는 메서드가 있는 경우 해당 인스턴스를 만들 수 없으며 누락된 형식 매개 변수를 제공할 수 없습니다.If you have an open generic type or method that is not a generic type or method definition, you cannot create instances of it and you cannot supply the type parameters that are missing. 제네릭 형식 또는 메서드 정의가 있어야 합니다.You must have a generic type or method definition. GetGenericTypeDefinition 메서드를 사용하여 제네릭 형식 정의를 가져오거나 GetGenericMethodDefinition 메서드를 사용하여 제네릭 메서드 정의를 가져옵니다.Use the GetGenericTypeDefinition method to obtain the generic type definition or the GetGenericMethodDefinition method to obtain the generic method definition.

예를 들어 Type (Visual Basic의 Dictionary<int, string> )을 나타내는Dictionary(Of Integer, String) 개체가 있으며 Dictionary<string, MyClass>형식을 만들려는 경우 GetGenericTypeDefinition 메서드를 사용하여 Type 를 나타내는 Dictionary<TKey, TValue> 을 가져온 후 MakeGenericType 메서드를 사용하여 Type 를 나타내는 Dictionary<int, MyClass>을 생성할 수 있습니다.For example, if you have a Type object representing Dictionary<int, string> (Dictionary(Of Integer, String) in Visual Basic) and you want to create the type Dictionary<string, MyClass>, you can use the GetGenericTypeDefinition method to get a Type representing Dictionary<TKey, TValue> and then use the MakeGenericType method to produce a Type representing Dictionary<int, MyClass>.

제네릭 형식이 아닌 개방형 제네릭 형식의 예제는 이 항목의 뒷부분에 나오는 "형식 매개 변수 또는 형식 인수"를 참조하세요.For an example of an open generic type that is not a generic type, see "Type Parameter or Type Argument" later in this topic.

형식 인수 및 형식 매개 변수 검사Examining Type Arguments and Type Parameters

Type.GetGenericArguments 메서드를 사용하여 제네릭 형식의 형식 매개 변수 또는 형식 인수를 나타내는 Type 개체의 배열을 가져오고, MethodInfo.GetGenericArguments 메서드를 사용하여 제네릭 메서드에 대해 동일한 작업을 수행합니다.Use the Type.GetGenericArguments method to obtain an array of Type objects that represent the type parameters or type arguments of a generic type, and use the MethodInfo.GetGenericArguments method to do the same for a generic method.

Type 개체가 형식 매개 변수를 나타내는 것을 알고 있다면 리플렉션이 대답할 수 있는 추가 질문이 많습니다.Once you know that a Type object represents a type parameter, there are many additional questions reflection can answer. 형식 매개 변수의 소스, 해당 위치 및 해당 제약 조건을 확인할 수 있습니다.You can determine the type parameter's source, its position, and its constraints.

형식 매개 변수 또는 형식 인수Type Parameter or Type Argument

배열의 특정 요소가 형식 매개 변수인지 또는 형식 인수인지 확인하려면 IsGenericParameter 속성을 사용합니다.To determine whether a particular element of the array is a type parameter or a type argument, use the IsGenericParameter property. 요소가 형식 매개 변수인 경우 IsGenericParameter 속성은 true 입니다.The IsGenericParameter property is true if the element is a type parameter.

제네릭 형식은 제네릭 형식 정의 없이 열릴 수 있으며, 이 경우에 형식 인수 및 형식 매개 변수가 혼합됩니다.A generic type can be open without being a generic type definition, in which case it has a mixture of type arguments and type parameters. 예를 들어 다음 코드에서 D 클래스는 D 의 첫 번째 형식 매개 변수로 B의 두 번째 형식 매개 변수를 대체하여 생성한 형식에서 파생됩니다.For example, in the following code, class D derives from a type created by substituting the first type parameter of D for the second type parameter of 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> {};  

Type 를 나타내는 D<V, W> 개체를 가져오고 BaseType 속성을 사용하여 해당 기본 형식을 가져오는 경우 결과적으로 type B<int, V> 가 열리지만 제네릭 형식 정의는 아닙니다.If you obtain a Type object representing D<V, W> and use the BaseType property to obtain its base type, the resulting type B<int, V> is open, but it is not a generic type definition.

제네릭 매개 변수의 소스Source of a Generic Parameter

제네릭 형식 매개 변수는 검사 중인 형식, 바깥쪽 형식 또는 제네릭 메서드에서 가져올 수 있습니다.A generic type parameter might come from the type you are examining, from an enclosing type, or from a generic method. 다음과 같이 제네릭 형식 매개 변수의 소스를 확인할 수 있습니다.You can determine the source of the generic type parameter as follows:

  • 먼저, DeclaringMethod 속성을 사용하여 형식 매개 변수가 제네릭 메서드에서 가져온 것인지 확인합니다.First, use the DeclaringMethod property to determine whether the type parameter comes from a generic method. 속성 값이 null 참조(Visual Basic의Nothing )가 아니면 소스가 제네릭 메서드입니다.If the property value is not a null reference (Nothing in Visual Basic), then the source is a generic method.

  • 소스가 제네릭 메서드가 아닌 경우 DeclaringType 속성을 사용하여 제네릭 형식 매개 변수가 속한 제네릭 형식을 확인합니다.If the source is not a generic method, use the DeclaringType property to determine the generic type the generic type parameter belongs to.

형식 매개 변수가 제네릭 메서드에 속한 경우 DeclaringType 속성은 관련이 없는 제네릭 메서드를 선언한 형식을 반환합니다.If the type parameter belongs to a generic method, the DeclaringType property returns the type that declared the generic method, which is irrelevant.

제네릭 매개 변수의 위치Position of a Generic Parameter

선언하는 해당 클래스의 형식 매개 변수 목록에서 형식 매개 변수의 위치를 확인할 필요가 가끔 있습니다.In rare situations, it is necessary to determine the position of a type parameter in the type parameter list of its declaring class. 예를 들어 앞의 예제에서 Type 형식을 나타내는 B<int, V> 개체가 있다고 가정합니다.For example, suppose you have a Type object representing the B<int, V> type from the preceding example. GetGenericArguments 메서드는 형식 인수의 목록을 제공하므로 V 를 검사할 경우 DeclaringMethodDeclaringType 속성을 사용하여 어디에서 가져왔는지 검색할 수 있습니다.The GetGenericArguments method gives you a list of type arguments, and when you examine V you can use the DeclaringMethod and DeclaringType properties to discover where it comes from. 그런 다음 GenericParameterPosition 속성을 사용하여 원래 정의된 형식 매개 변수 목록에서 해당 위치를 확인할 수 있습니다.You can then use the GenericParameterPosition property to determine its position in the type parameter list where it was defined. 이 예제에서 V 는 원래 정의된 형식 매개 변수 목록에서 0(영) 위치에 있습니다.In this example, V is at position 0 (zero) in the type parameter list where it was defined.

기본 형식 및 인터페이스 제약 조건Base Type and Interface Constraints

GetGenericParameterConstraints 메서드를 사용하여 형식 매개 변수의 기본 형식 제약 조건 및 인터페이스 제약 조건을 가져옵니다.Use the GetGenericParameterConstraints method to obtain the base type constraint and interface constraints of a type parameter. 배열 요소의 순서는 중요하지 않습니다.The order of the elements of the array is not significant. 요소는 인터페이스 형식인 경우 인터페이스 제약 조건을 나타냅니다.An element represents an interface constraint if it is an interface type.

제네릭 매개 변수 특성Generic Parameter Attributes

GenericParameterAttributes 속성은 형식 매개 변수의 분산(공 분산 및 반공 분산) 및 특별 제약 조건을 나타내는 GenericParameterAttributes 값을 가져옵니다.The GenericParameterAttributes property gets a GenericParameterAttributes value that indicates the variance (covariance or contravariance) and the special constraints of a type parameter.

공 분산 및 반공 분산Covariance and Contravariance

형식 매개 변수가 공 분산인지 또는 반공 분산인지 확인하려면 GenericParameterAttributes.VarianceMask 마스크를 GenericParameterAttributes 속성에서 반환한 GenericParameterAttributes 값에 적용합니다.To determine whether a type parameter is covariant or contravariant, apply the GenericParameterAttributes.VarianceMask mask to the GenericParameterAttributes value that is returned by the GenericParameterAttributes property. 결과가 GenericParameterAttributes.None인 경우 형식 매개 변수는 고정입니다.If the result is GenericParameterAttributes.None, the type parameter is invariant. 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.See Covariance and Contravariance.

특별 제약 조건Special Constraints

형식 매개 변수의 특별 제약 조건을 확인하려면 GenericParameterAttributes.SpecialConstraintMask 마스크를 GenericParameterAttributes 속성에서 반환한 GenericParameterAttributes 값에 적용합니다.To determine the special constraints of a type parameter, apply the GenericParameterAttributes.SpecialConstraintMask mask to the GenericParameterAttributes value that is returned by the GenericParameterAttributes property. 결과가 GenericParameterAttributes.None인 경우 특별 제약 조건이 없습니다.If the result is GenericParameterAttributes.None, there are no special constraints. 형식 매개 변수는 참조 형식이어야 하고 Nullable이 아닌 값 형식이어야 하며 그리고 매개 변수가 없는 생성자를 보유해야 하는 제약을 받습니다.A type parameter can be constrained to be a reference type, to be a non-nullable value type, and to have a parameterless constructor.

고정Invariants

제네릭 형식에 대한 리플렉션의 일반적인 용어에 대한 고정 조건 표는 Type.IsGenericType을 참조하세요.For a table of the invariant conditions for common terms in reflection for generic types, see Type.IsGenericType. 제네릭 메서드와 관련된 추가 용어는 MethodBase.IsGenericMethod를 참조하세요.For additional terms relating to generic methods, see MethodBase.IsGenericMethod.

제목Title 설명Description
방법: 리플렉션을 사용하여 제네릭 형식 검사 및 인스턴스화How to: Examine and Instantiate Generic Types with Reflection TypeMethodInfo의 속성 및 메서드를 사용하여 제네릭 형식을 검사하는 방법을 보여 줍니다.Shows how to use the properties and methods of Type and MethodInfo to examine generic types.
제네릭Generics 제네릭 기능 및 .NET Framework에서 제네릭 기능을 지원하는 방법을 설명합니다.Describes the generics feature and how it is supported in the .NET Framework.
방법: 리플렉션 내보내기를 사용하여 제네릭 형식 정의How to: Define a Generic Type with Reflection Emit 리플렉션 내보내기를 사용하여 동적 어셈블리에서 제네릭 형식을 생성하는 방법을 보여 줍니다.Shows how to use reflection emit to generate generic types in dynamic assemblies.
형식 정보 보기Viewing Type Information Type 클래스를 설명하고 Type과 다양한 리플렉션 클래스를 함께 사용하여 생성자, 메서드, 필드, 속성, 이벤트에 대한 정보를 가져오는 방법을 보여 주는 코드 예제를 제공합니다.Describes the Type class and provides code examples that illustrate how to use Type with various reflection classes to obtain information about constructors, methods, fields, properties, and events.