내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Type.IsGenericType 속성

2013-12-13

현재 형식이 제네릭 형식인지 여부를 나타내는 값을 가져옵니다.

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

public virtual bool IsGenericType { get; }

속성 값

형식: System.Boolean
현재 형식이 제네릭 형식이면 true이고, 그렇지 않으면 false입니다.

IsGenericType 속성을 사용하여 Type 개체가 제네릭 형식을 나타내는지 여부를 확인하고, ContainsGenericParameters 속성을 사용하여 Type 개체가 개방형 생성 형식이나 폐쇄형 생성 형식을 나타내는지 여부를 확인합니다.

참고참고:

IsGenericType 속성은 해당 형식이 제네릭이 아니면 false를 반환합니다. 예를 들어, A<int>(Visual Basic의 경우 A(Of Integer)) 형식의 요소가 있는 배열 자체는 제네릭 형식이 아닙니다.

다음 표에는 제네릭 리플렉션에 사용되는 일반 용어에 대한 고정 조건이 요약되어 있습니다.

항목

고정 조건

제네릭 형식 정의(generic type definition)

IsGenericTypeDefinition 속성이 true인 경우

제네릭 형식을 정의합니다. 생성된 형식은 제네릭 형식 정의를 나타내는 Type 개체에 대해 MakeGenericType 메서드를 호출하고 형식 인수의 배열을 지정하여 만들어집니다.

MakeGenericType은 제네릭 형식 정의에 대해서만 호출할 수 있습니다.

모든 제네릭 형식 정의는 IsGenericType 속성이 true인 제네릭 형식이지만 그 반대는 성립하지 않습니다.

제네릭 형식(generic type)

IsGenericType 속성이 true인 경우

제네릭 형식 정의, 개방형 생성 형식 또는 폐쇄형 생성 형식일 수 있습니다.

제네릭인 요소 형식이 있는 배열 형식 자체는 제네릭 형식이 아닙니다. 이것은 제네릭 형식에 대한 포인터를 나타내는 Type 개체의 경우에도 마찬가지입니다.

개방형 생성 형식

ContainsGenericParameters 속성이 true인 경우

개방형 생성 형식의 예로는 할당되지 않은 형식 매개 변수가 있는 제네릭 형식, 제네릭 형식 정의나 개방형 생성 형식에 중첩된 형식, 또는 ContainsGenericParameters 속성이 true인 형식 인수가 있는 제네릭 형식이 포함됩니다.

개방형 생성 형식의 인스턴스는 만들 수 없습니다.

개방형 생성 형식이 모두 제네릭인 것은 아닙니다. 예를 들어, 요소 형식이 제네릭 형식인 배열과 개방형 생성 형식에 대한 포인터는 제네릭이 아닙니다.

폐쇄형 생성 형식

ContainsGenericParameters 속성이 false인 경우

재귀적으로 형식을 검사하면 할당되지 않은 제네릭 매개 변수가 형식에 없습니다.

제네릭 형식 매개 변수(generic type parameter)

IsGenericParameter 속성이 true인 경우

ContainsGenericParameters 속성이 true인 경우

제네릭 형식 정의에서 이후에 할당될 형식의 자리 표시자입니다.

제네릭 형식 인수(generic type argument)

제네릭 형식 매개 변수를 비롯하여 모든 형식일 수 있습니다.

형식 인수는 생성된 제네릭 형식을 만들 때 MakeGenericType 메서드에 전달되는 Type 개체의 배열로 지정됩니다. 생성된 제네릭 형식의 인스턴스를 만들려는 경우 ContainsGenericParameters 속성은 모든 형식 인수에 대해 false여야 합니다.

다음 코드 예제와 표에서는 이러한 용어 및 고정 조건을 몇 가지 보여 줍니다. 여기서 Derived 클래스의 경우 기본 형식이 형식 인수 목록에 형식과 형식 매개 변수가 혼합되어 있는 생성된 형식이므로 특히 중요합니다.

public class Base<T,U> {}
public class Derived<V> : Base<String,V> 
{
    public G<Derived<V>> F;
    public class Nested {}
}
public class G<T> {}

다음 표에서는 Base, DerivedG 클래스를 사용하고 이러한 클래스에서 빌드하는 예를 보여 줍니다. C++ 및 C# 코드가 같은 경우에는 한 항목만 나와 있습니다.

예제

고정 조건

Derived(Of V)

Derived<V>

이 형식에 대한 고정 조건은 다음과 같습니다.

IsGenericTypetrue인 경우

IsGenericTypeDefinitiontrue인 경우

ContainsGenericParameterstrue인 경우

Base(Of String, V)

Base<String,V>

Base<String^,V>

이 형식에 대한 고정 조건은 다음과 같습니다.

IsGenericTypetrue인 경우

IsGenericTypeDefinitionfalse인 경우

ContainsGenericParameterstrue인 경우

Dim d() As Derived(Of Integer)

Derived<int>[] d;

array<Derived<int>^>^ d;

변수 d의 형식에 대한 고정 조건은 다음과 같습니다.

d가 배열이므로 IsGenericTypefalse입니다.

IsGenericTypeDefinitionfalse인 경우

ContainsGenericParametersfalse인 경우

T, UV(나타나는 모든 위치)

IsGenericParametertrue인 경우

형식 매개 변수를 제네릭 형식으로 제한할 수 없으므로 IsGenericTypefalse입니다.

IsGenericTypeDefinitionfalse인 경우

T, UV 자체가 제네릭 형식 매개 변수이므로 ContainsGenericParameterstrue입니다. 이것이 나중에 매개 변수에 할당되는 형식 인수에 대한 어떠한 정보를 의미하지는 않습니다.

필드 F의 형식

IsGenericTypetrue인 경우

형식이 형식 매개 변수 G에 할당되었으므로 IsGenericTypeDefinitionfalse입니다. 이것은 MakeGenericType 메서드를 호출한 것과 동일합니다.

필드 F의 형식에 개방형 생성 형식인 형식 인수가 있으므로 ContainsGenericParameterstrue입니다. 해당 형식 인수, 즉 Base가 제네릭 형식 정의이므로 생성된 형식이 열려 있습니다. 이것은 IsGenericType 속성의 재귀적 특성을 보여 줍니다.

중첩 클래스 Nested

Nested 클래스에는 자체 제네릭 형식 매개 변수가 없지만 이 클래스가 제네릭 형식에 중첩되어 있으므로 IsGenericTypetrue입니다.

IsGenericTypeDefinitiontrue인 경우 즉, MakeGenericType 메서드를 호출하고 바깥쪽 형식 Derived의 형식 매개 변수를 제공할 수 있습니다.

바깥쪽 형식 Derived에 제네릭 형식 매개 변수가 있으므로 ContainsGenericParameterstrue입니다. 이것은 ContainsGenericParameters 속성의 재귀적 특성을 보여 줍니다.

다음 코드 예제에서는 설명 부분에서 설명한 형식에 대한 IsGenericType, IsGenericTypeDefinition, IsGenericParameterContainsGenericParameters 속성 값을 표시합니다. 속성 값에 대한 설명은 설명 부분의 해당 표를 참조하세요.

참고참고:

이 예제를 실행하려면 Windows Phone용 정적 TextBlock 컨트롤이 있는 예제 빌드를 참조하세요.


using System;
using System.Reflection;

public class Base<T, U> { }

public class Derived<V> : Base<string, V>
{
   public G<Derived<V>> F;

   public class Nested { }
}

public class G<T> { }

class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // Get the generic type definition for Derived, and the base
      // type for Derived.
      //
      Type tDerived = typeof(Derived<>);
      Type tDerivedBase = tDerived.BaseType;

      // Declare an array of Derived<int>, and get its type.
      //
      Derived<int>[] d = new Derived<int>[0];
      Type tDerivedArray = d.GetType();

      // Get a generic type parameter, the type of a field, and a
      // type that is nested in Derived. Notice that in order to
      // get the nested type it is necessary to either (1) specify
      // the generic type definition Derived<>, as shown here,
      // or (2) specify a type parameter for Derived.
      //
      Type tT = typeof(Base<,>).GetGenericArguments()[0];
      Type tF = tDerived.GetField("F").FieldType;
      Type tNested = typeof(Derived<>.Nested);

      DisplayGenericType(outputBlock, tDerived, "Derived<V>");
      DisplayGenericType(outputBlock, tDerivedBase, "Base type of Derived<V>");
      DisplayGenericType(outputBlock, tDerivedArray, "Array of Derived<int>");
      DisplayGenericType(outputBlock, tT, "Type parameter T from Base<T>");
      DisplayGenericType(outputBlock, tF, "Field type, G<Derived<V>>");
      DisplayGenericType(outputBlock, tNested, "Nested type in Derived<V>");
   }

   public static void DisplayGenericType(System.Windows.Controls.TextBlock outputBlock, Type t, string caption)
   {
      outputBlock.Text += String.Format("\n{0}", caption) + "\n";
      outputBlock.Text += String.Format("    Type: {0}", t) + "\n";

      outputBlock.Text += String.Format("\t            IsGenericType: {0}",
          t.IsGenericType) + "\n";
      outputBlock.Text += String.Format("\t  IsGenericTypeDefinition: {0}",
          t.IsGenericTypeDefinition) + "\n";
      outputBlock.Text += String.Format("\tContainsGenericParameters: {0}",
          t.ContainsGenericParameters) + "\n";
      outputBlock.Text += String.Format("\t       IsGenericParameter: {0}",
          t.IsGenericParameter) + "\n";
   }
}

/* This code example produces the following output:

Derived<V>
    Type: Derived`1[V]
                    IsGenericType: True
          IsGenericTypeDefinition: True
        ContainsGenericParameters: True
               IsGenericParameter: False

Base type of Derived<V>
    Type: Base`2[System.String,V]
                    IsGenericType: True
          IsGenericTypeDefinition: False
        ContainsGenericParameters: True
               IsGenericParameter: False

Array of Derived<int>
    Type: Derived`1[System.Int32][]
                    IsGenericType: False
          IsGenericTypeDefinition: False
        ContainsGenericParameters: False
               IsGenericParameter: False

Type parameter T from Base<T>
    Type: T
                    IsGenericType: False
          IsGenericTypeDefinition: False
        ContainsGenericParameters: True
               IsGenericParameter: True

Field type, G<Derived<V>>
    Type: G`1[Derived`1[V]]
                    IsGenericType: True
          IsGenericTypeDefinition: False
        ContainsGenericParameters: True
               IsGenericParameter: False

Nested type in Derived<V>
    Type: Derived`1+Nested[V]
                    IsGenericType: True
          IsGenericTypeDefinition: True
        ContainsGenericParameters: True
               IsGenericParameter: False
 */


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시:
© 2014 Microsoft