Type.IsGenericType プロパティ

定義

現在の型がジェネリック型かどうかを示す値を取得します。

public:
 virtual property bool IsGenericType { bool get(); };
public virtual bool IsGenericType { get; }
member this.IsGenericType : bool
Public Overridable ReadOnly Property IsGenericType As Boolean

プロパティ値

Boolean

true 現在の型がジェネリック型の場合は。それ以外の場合は false

次のコード例では、「 IsGenericType IsGenericTypeDefinition IsGenericParameter 解説」で説明されている型の、、、およびの各プロパティの値を表示し ContainsGenericParameters ます。 プロパティ値の説明については、「解説」の表を参照してください。

using namespace System;
using namespace System::Reflection;

generic<typename T, typename U> public ref class Base {};

generic<typename T> public ref class G {};

generic<typename V> public ref class Derived : Base<String^, V>
{
public: 
    G<Derived<V>^>^ F;

    ref class Nested {};
};

void DisplayGenericType(Type^ t, String^ caption)
{
    Console::WriteLine("\n{0}", caption);
    Console::WriteLine("    Type: {0}", t);

    Console::WriteLine("\t            IsGenericType: {0}", 
        t->IsGenericType);
    Console::WriteLine("\t  IsGenericTypeDefinition: {0}", 
        t->IsGenericTypeDefinition);
    Console::WriteLine("\tContainsGenericParameters: {0}", 
        t->ContainsGenericParameters);
    Console::WriteLine("\t       IsGenericParameter: {0}", 
        t->IsGenericParameter);
}

void main()
{
    // Get the generic type definition for Derived, and the base
    // type for Derived.
    //
    Type^ tDerived = Derived::typeid;
    Type^ tDerivedBase = tDerived->BaseType;

    // Declare an array of Derived<int>, and get its type.
    //
    array<Derived<int>^>^ d = gcnew array<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::typeid, as shown here,
    // or (2) specify a type parameter for Derived.
    //
    Type^ tT = Base::typeid->GetGenericArguments()[0];
    Type^ tF = tDerived->GetField("F")->FieldType;
    Type^ tNested = Derived::Nested::typeid;

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

/* This code example produces the following output:

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

Base type of generic<V> Derived
    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 generic<T> Base
    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 generic<V> Derived
    Type: Derived`1+Nested[V]
                    IsGenericType: True
          IsGenericTypeDefinition: True
        ContainsGenericParameters: True
               IsGenericParameter: False
 */
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 Main()
    {
        // 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(tDerived, "Derived<V>");
        DisplayGenericType(tDerivedBase, "Base type of Derived<V>");
        DisplayGenericType(tDerivedArray, "Array of Derived<int>");
        DisplayGenericType(tT, "Type parameter T from Base<T>");
        DisplayGenericType(tF, "Field type, G<Derived<V>>");
        DisplayGenericType(tNested, "Nested type in Derived<V>");
    }

    public static void DisplayGenericType(Type t, string caption)
    {
        Console.WriteLine("\n{0}", caption);
        Console.WriteLine("    Type: {0}", t);

        Console.WriteLine("\t            IsGenericType: {0}", 
            t.IsGenericType);
        Console.WriteLine("\t  IsGenericTypeDefinition: {0}", 
            t.IsGenericTypeDefinition);
        Console.WriteLine("\tContainsGenericParameters: {0}", 
            t.ContainsGenericParameters);
        Console.WriteLine("\t       IsGenericParameter: {0}", 
            t.IsGenericParameter);
    }
}

/* 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
 */
Imports System.Reflection

' 
Public Class Base(Of T, U)
End Class

Public Class Derived(Of V) 
    Inherits Base(Of String, V)

    Public F As G(Of Derived(Of V))

    Public Class Nested
    End Class
End Class

Public Class G(Of T)
End Class 

Module Example

    Sub Main

        ' Get the generic type definition for Derived, and the base
        ' type for Derived.
        '
        Dim tDerived As Type = GetType(Derived(Of ))
        Dim tDerivedBase As Type = tDerived.BaseType

        ' Declare an array of Derived(Of Integer), and get its type.
        '
        Dim d(0) As Derived(Of Integer)
        Dim tDerivedArray As Type = 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(Of ), as shown here,
        ' or (2) specify a type parameter for Derived.
        '
        Dim tT As Type = GetType(Base(Of ,)).GetGenericArguments()(0)
        Dim tF As Type = tDerived.GetField("F").FieldType
        Dim tNested As Type = GetType(Derived(Of ).Nested)

        DisplayGenericType(tDerived, "Derived(Of V)")
        DisplayGenericType(tDerivedBase, "Base type of Derived(Of V)")
        DisplayGenericType(tDerivedArray, "Array of Derived(Of Integer)")
        DisplayGenericType(tT, "Type parameter T from Base(Of T)")
        DisplayGenericType(tF, "Field type, G(Of Derived(Of V))")
        DisplayGenericType(tNested, "Nested type in Derived(Of V)")

    End Sub

    Sub DisplayGenericType(ByVal t As Type, ByVal caption As String)

        Console.WriteLine(vbLf & caption)
        Console.WriteLine("    Type: {0}", t)

        Console.WriteLine(vbTab & "            IsGenericType: {0}", _
            t.IsGenericType)
        Console.WriteLine(vbTab & "  IsGenericTypeDefinition: {0}", _
            t.IsGenericTypeDefinition)
        Console.WriteLine(vbTab & "ContainsGenericParameters: {0}", _
            t.ContainsGenericParameters)
        Console.WriteLine(vbTab & "       IsGenericParameter: {0}", _
            t.IsGenericParameter)

    End Sub

End Module

' This code example produces the following output:
'
'Derived(Of V)
'    Type: Derived`1[V]
'                    IsGenericType: True
'          IsGenericTypeDefinition: True
'        ContainsGenericParameters: True
'               IsGenericParameter: False
'
'Base type of Derived(Of V)
'    Type: Base`2[System.String,V]
'                    IsGenericType: True
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: True
'               IsGenericParameter: False
'
'Array of Derived(Of Integer)
'    Type: Derived`1[System.Int32][]
'                    IsGenericType: False
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: False
'               IsGenericParameter: False
'
'Type parameter T from Base(Of T)
'    Type: T
'                    IsGenericType: False
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: True
'               IsGenericParameter: True
'
'Field type, G(Of Derived(Of V))
'    Type: G`1[Derived`1[V]]
'                    IsGenericType: True
'          IsGenericTypeDefinition: False
'        ContainsGenericParameters: True
'               IsGenericParameter: False
'
'Nested type in Derived(Of V)
'    Type: Derived`1+Nested[V]
'                    IsGenericType: True
'          IsGenericTypeDefinition: True
'        ContainsGenericParameters: True
'               IsGenericParameter: False

注釈

IsGenericType Type オブジェクトがジェネリック型を表すかどうかを判断するには、プロパティを使用します。 プロパティを使用して、 ContainsGenericParameters Type オブジェクトがオープン構築型とクローズ構築型のどちらであるかを判断します。

注意

IsGenericType false イミディエイト型がジェネリックでない場合、プロパティはを返します。 たとえば、要素が型 A<int> ( A(Of Integer) Visual Basic) である配列はそれ自体がジェネリック型ではありません。

次の表は、一般的なリフレクションで使用される一般的な用語の不変条件をまとめたものです。

期間 インバリアント
ジェネリック型定義 IsGenericTypeDefinition プロパティが true です。

ジェネリック型を定義します。 構築された型は、 MakeGenericType ジェネリック型定義を表すオブジェクトに対してメソッドを呼び出し、型引数の配列を指定することによって作成され Type ます。

MakeGenericType は、ジェネリック型定義でのみ呼び出すことができます。

ジェネリック型定義はジェネリック型 ( IsGenericType プロパティは true ) ですが、逆の場合は true になりません。
ジェネリック型 IsGenericType プロパティが true です。

には、ジェネリック型定義、オープン構築型、またはクローズ構築型を指定できます。

要素型がジェネリックである配列型は、それ自体がジェネリック型ではないことに注意してください。 これは、 Type ジェネリック型へのポインターを表すオブジェクトにも当てはまります。
構築された型を開く ContainsGenericParameters プロパティが true です。

例としては、割り当てられていない型パラメーターを持つジェネリック型、ジェネリック型定義またはオープン構築型で入れ子にされた型、またはプロパティがである型引数を持つジェネリック型があり ContainsGenericParameters true ます。

オープン構築型のインスタンスを作成することはできません。

すべてのオープン構築型がジェネリックではないことに注意してください。 たとえば、要素型がジェネリック型定義である配列はジェネリックではなく、オープン構築型へのポインターはジェネリックではありません。
閉じた構築型 ContainsGenericParameters プロパティが false です。

再帰的に検査するときに、型に割り当てられていないジェネリックパラメーターがありません。
ジェネリック型パラメーター IsGenericParameter プロパティが true です。

ContainsGenericParameters プロパティが true です。

ジェネリック型定義で、後で割り当てられる型のプレースホルダー。
ジェネリック型引数 には、ジェネリック型パラメーターを含む任意の型を指定できます。

型引数は、構築された Type ジェネリック型を作成するときにメソッドに渡されるオブジェクトの配列として指定され MakeGenericType ます。 結果の型のインスタンスを作成する場合は、 ContainsGenericParameters false すべての型引数に対してプロパティをにする必要があります。

次のコード例と表は、これらの用語と不変条件の一部を示しています。 クラスは、 Derived その基本型が型引数リストに型パラメーターと型パラメーターが混在する構築型であるため、特に重要です。

generic<typename T, typename U> public ref class Base {};

generic<typename T> public ref class G {};

generic<typename V> public ref class Derived : Base<String^, V>
{
public:
    G<Derived<V>^>^ F;

    ref class Nested {};
};
public class Base<T, U> {}

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

    public class Nested {}
}

public class G<T> {}
Public Class Base(Of T, U)
End Class

Public Class Derived(Of V)
    Inherits Base(Of String, V)

    Public F As G(Of Derived(Of V))

    Public Class Nested
    End Class
End Class

Public Class G(Of T)
End Class

次の表に、クラス、、およびを使用して構築する例を示し Base Derived G ます。 C++ と C# のコードが同じ場合は、1つのエントリのみが表示されます。

インバリアント
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 :

IsGenericTypefalse 配列であるためです d

IsGenericTypeDefinitionfalseです。

ContainsGenericParametersfalseです。
TU 、および V (すべてが表示されます) IsGenericParametertrueです。

IsGenericTypefalse 、型パラメーターをジェネリック型に制約する方法がないためです。

IsGenericTypeDefinitionfalseです。

ContainsGenericParameterstrue T 、、 U 、および V 自体がジェネリック型パラメーターであるためです。 これは、後で型引数に代入されるものを意味しません。
フィールドの種類 F IsGenericTypetrueです。

IsGenericTypeDefinition は、 false の型パラメーターに型が割り当てられているためです G 。 これは、メソッドを呼び出した場合と同じであることに注意 MakeGenericType してください。

ContainsGenericParameters は、 true フィールドの型に、 F オープン構築型の型引数があるためです。 構築された型は、その型引数 (つまり、 Base ) がジェネリック型定義であるため、オープンです。 これは、プロパティの再帰的な性質を示してい IsGenericType ます。
入れ子になったクラス Nested IsGenericTypetrue 、ジェネリック型に入れ子になって Nested いるため、クラスに独自のジェネリック型パラメーターがない場合でも、です。

IsGenericTypeDefinitiontrueです。 つまり、メソッドを呼び出して、 MakeGenericType それを囲む型の型パラメーターを指定でき Derived ます。

ContainsGenericParameters は、 true 外側の型に Derived ジェネリック型パラメーターがあるためです。 これは、プロパティの再帰的な性質を示してい ContainsGenericParameters ます。

適用対象

こちらもご覧ください