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、 IsGenericTypeDefinitionIsGenericParameter、 和 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
*/
open System
type Base<'T, 'U>() = class end
type G<'T>() = class end
type Derived<'V>() =
inherit Base<string, 'V>()
[<DefaultValue>]
val mutable public F : G<Derived<'V>>
let displayGenericType (t: Type) caption =
printfn $"\n{caption}"
printfn $" Type: {t}"
printfn $"\t IsGenericType: {t.IsGenericType}"
printfn $"\t IsGenericTypeDefinition: {t.IsGenericTypeDefinition}"
printfn $"\tContainsGenericParameters: {t.ContainsGenericParameters}"
printfn $"\t IsGenericParameter: {t.IsGenericParameter}"
// Get the generic type definition for Derived, and the base
// type for Derived.
let tDerived = typeof<Derived<_>>.GetGenericTypeDefinition()
let tDerivedBase = tDerived.BaseType
// Declare an array of Derived<int>, and get its type.
let d = Array.zeroCreate<Derived<int>> 0
let 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.
let tT = typeof<Base<_,_>>.GetGenericTypeDefinition().GetGenericArguments()[0]
let tF = tDerived.GetField("F").FieldType
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>>"
(* 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
*)
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
傳回 。 例如,在Visual Basic) 中,元素屬於類型 A<int>
(A(Of Integer)
的陣列本身不是泛型類型。
下表摘要說明泛型反映中常用詞彙的不變異條件。
詞彙 | 非變異值 |
---|---|
Generic Type Definition - 泛型類型定義 |
IsGenericTypeDefinition 屬性為 true 。定義泛型型別。 建構型別是藉由在代表泛型型別定義並指定型別自變數陣列的物件上Type呼叫 MakeGenericType 方法來建立。 MakeGenericType 只能在泛型型別定義上呼叫。 任何泛型類型定義都是泛型類型, (IsGenericType 屬性是 true ) ,但相反的則不是 true。 |
Generic Type - 泛型類型 |
IsGenericType 屬性為 true 。可以是泛型型別定義、開放式建構型別或封閉式建構型別。 請注意,其專案類型為泛型的數位類型本身不是泛型類型。 表示泛型型別指標的物件 Type 也是如此。 |
open 建構類型 |
ContainsGenericParameters 屬性為 true 。範例包括具有未指派型別參數的泛型型別、泛型型別定義或開放式建構型別中的巢狀類型,或具有屬性為 true 之型別自變數的ContainsGenericParameters泛型型別。您無法建立開放式建構類型的實例。 請注意,並非所有開啟的建構型別都是泛型型別。 例如,元素類型為泛型型別定義的數位不是泛型型別,而開啟建構型別的指標不是泛型。 |
封閉式建構類型 |
ContainsGenericParameters 屬性為 false 。以遞歸方式檢查時,類型沒有未指派的泛型參數。 |
Generic Type Parameter - 泛型型別參數 |
IsGenericParameter 屬性為 true 。ContainsGenericParameters 屬性為 true 。在泛型型別定義中,稍後將指派之型別的佔位符。 |
Generic Type Argument - 泛型類型引數 | 可以是任何類型,包括泛型型別參數。 建立建構的 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> {}
type Base<'T, 'U>() = class end
type G<'T>() = class end
type Derived<'V>() =
inherit Base<string, 'V>()
[<DefaultValue>]
val mutable public F : G<Derived<'V>>
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
下表顯示使用 和建置在、 Derived
和 G
類別Base
上的範例。 當 C++ 和 C# 程式代碼相同時,只會顯示一個專案。
範例 | 非變異值 |
---|---|
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並提供封入型別的 type 參數。 Derived ContainsGenericParameters true 這是因為封入類型 具有泛型型Derived 別參數。 這說明屬性的 ContainsGenericParameters 遞迴本質。 |