情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Type.IsGenericType プロパティ

2013/12/12

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

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)) である場合、配列そのものはジェネリック型ではありません。

ジェネリック リフレクションで使われる一般的な用語に関する一定の条件を次の表に示します。

語句

一定の条件

ジェネリック型定義

IsGenericTypeDefinition プロパティが true です。

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

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

すべてのジェネリック型定義はジェネリック型ですが (IsGenericType プロパティは true)、ジェネリック型がすべてジェネリック型定義というわけではありません。

ジェネリック型

IsGenericType プロパティが true です。

ジェネリック型には、ジェネリック型定義、オープン構築型、またはクローズ構築型があります。

配列型の要素型がジェネリックである場合に、配列型そのものがジェネリック型でないことに注意してください。ジェネリック型へのポインターを表す Type オブジェクトも同様です。

オープン構築型

ContainsGenericParameters プロパティが true です。

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

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

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

クローズ構築型

ContainsGenericParameters プロパティが false です。

再帰的に調べた場合に、この型には未割り当てのジェネリック パラメーターはありません。

ジェネリック型パラメーター

IsGenericParameter プロパティが true です。

ContainsGenericParameters プロパティが true です。

ジェネリック型定義で、後から割り当てられる型のプレースホルダーです。

ジェネリック型引数

ジェネリック型パラメーターなど任意の型にすることができます。

型引数は、構築ジェネリック型を作成するときに、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> {}

BaseDerived、および 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 の型の場合

d は配列なので IsGenericTypefalse です。

IsGenericTypeDefinitionfalse です。

ContainsGenericParametersfalse です。

TU、および V (出現するあらゆる箇所で)

IsGenericParametertrue です。

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

IsGenericTypeDefinitionfalse です。

TU、および V 自体がジェネリック型パラメーターなので、ContainsGenericParameterstrue です。これは、後でそれらに割り当てられる型引数については何も示していません。

フィールド F の型

IsGenericTypetrue です。

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

フィールド F の型が持っている型引数はオープン構築型なので、ContainsGenericParameterstrue です。構築型の型引数 (Base) はジェネリック型定義なので、構築型は開いた型です。これは、IsGenericType プロパティの再帰的な性質を示しています。

入れ子になっているクラス Nested

Nested クラスに固有のジェネリック型パラメーターがなくても、ジェネリック型の入れ子になっているので、IsGenericTypetrue です。

IsGenericTypeDefinitiontrue です。つまり、MakeGenericType メソッドを呼び出して、包含する型の型パラメーターを提供できます (Derived)。

包含する型 Derived がジェネリック型パラメーターを持っているので、ContainsGenericParameterstrue です。これは、ContainsGenericParameters プロパティの再帰的な性質を示しています。

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

メモメモ:

この例を実行するには、「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

表示: