Type.IsGenericType プロパティ
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
現在の型がジェネリック型かどうかを示す値を取得します。
public:
virtual property bool IsGenericType { bool get(); };
public virtual bool IsGenericType { get; }
member this.IsGenericType : bool
Public Overridable ReadOnly Property IsGenericType As 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> |
この型の場合: IsGenericType が true です。IsGenericTypeDefinition が true です。ContainsGenericParameters が true です。 |
Base(Of String, V) Base<String,V> Base<String^,V> |
この型の場合: IsGenericType が true です。IsGenericTypeDefinition が false です。ContainsGenericParameters が true です。 |
Dim d() As Derived(Of Integer) Derived<int>[] d; array<Derived<int>^>^ d; |
変数の型の場合 d :IsGenericType が false 配列であるためです d 。IsGenericTypeDefinition が false です。ContainsGenericParameters が false です。 |
T 、 U 、および V (すべてが表示されます) |
IsGenericParameter が true です。IsGenericType は false 、型パラメーターをジェネリック型に制約する方法がないためです。IsGenericTypeDefinition が false です。ContainsGenericParameters は true T 、、 U 、および V 自体がジェネリック型パラメーターであるためです。 これは、後で型引数に代入されるものを意味しません。 |
フィールドの種類 F |
IsGenericType が true です。IsGenericTypeDefinition は、 false の型パラメーターに型が割り当てられているためです G 。 これは、メソッドを呼び出した場合と同じであることに注意 MakeGenericType してください。ContainsGenericParameters は、 true フィールドの型に、 F オープン構築型の型引数があるためです。 構築された型は、その型引数 (つまり、 Base ) がジェネリック型定義であるため、オープンです。 これは、プロパティの再帰的な性質を示してい IsGenericType ます。 |
入れ子になったクラス Nested |
IsGenericType は true 、ジェネリック型に入れ子になって Nested いるため、クラスに独自のジェネリック型パラメーターがない場合でも、です。IsGenericTypeDefinition が true です。 つまり、メソッドを呼び出して、 MakeGenericType それを囲む型の型パラメーターを指定でき Derived ます。ContainsGenericParameters は、 true 外側の型に Derived ジェネリック型パラメーターがあるためです。 これは、プロパティの再帰的な性質を示してい ContainsGenericParameters ます。 |