Type.MakeGenericType(Type[]) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
用類型陣列的項目取代目前泛型類型定義的型別參數,並傳回代表所得結果建構類型的 Type 物件。
public:
abstract Type ^ MakeGenericType(... cli::array <Type ^> ^ typeArguments);
public:
virtual Type ^ MakeGenericType(... cli::array <Type ^> ^ typeArguments);
public abstract Type MakeGenericType (params Type[] typeArguments);
public virtual Type MakeGenericType (params Type[] typeArguments);
abstract member MakeGenericType : Type[] -> Type
abstract member MakeGenericType : Type[] -> Type
override this.MakeGenericType : Type[] -> Type
Public MustOverride Function MakeGenericType (ParamArray typeArguments As Type()) As Type
Public Overridable Function MakeGenericType (ParamArray typeArguments As Type()) As Type
參數
- typeArguments
- Type[]
由類型組成的陣列,用來取代目前泛型類型的類型參數。
傳回
Type,表示用 typeArguments
的項目取代目前泛型類型之類型參數所得到的建構類型。
例外狀況
目前類型不代表泛型型別定義。 亦即,IsGenericTypeDefinition 會傳回 false
。
typeArguments
中的項目數和目前泛型型別定義的類型參數數目不同。
-或-
typeArguments
的所有項目都不符合目前泛型型別的對應類型參數所指定的條件約束。
-或-
typeArguments
中包含的項目是指標型別 (IsPointer 傳回 true
)、by-ref 型別 (IsByRef 傳回 true
) 或Void。
基底類別不支援叫用的方法。 衍生類別必須提供實作。
範例
下列範例會 MakeGenericType 使用 方法,從型別的泛型型別定義 Dictionary<TKey,TValue> 建立建構型別。 建構的類型代表 Dictionary<TKey,TValue> 具有字串索引鍵之 Test
物件的 。
using namespace System;
using namespace System::Reflection;
using namespace System::Collections::Generic;
namespace Example
{
public ref class Test
{
public:
static void CreateConstructedType(void)
{
Console::WriteLine("\r\n--- Create a constructed type"
" from the generic Dictionary`2 type.");
// Create a type object representing
// the generic Dictionary`2 type.
Type^ genericType = Type::GetType(
"System.Collections.Generic.Dictionary`2");
if (genericType != nullptr)
{
DisplayTypeInfo(genericType);
}
else
{
Console::WriteLine("The type is not found");
return;
}
// Create an array of types to substitute for the type
// parameters of Dictionary`2.
// The key is of type string, and the type to be
// contained in the Dictionary`2 is Test.
array<Type^>^ typeArgs = {String::typeid, Test::typeid};
Type^ constructedType =
genericType->MakeGenericType(typeArgs);
DisplayTypeInfo(constructedType);
// Compare the type objects obtained above to type objects
// obtained using typeof() and GetGenericTypeDefinition().
Console::WriteLine("\r\n--- Compare types obtained by"
" different methods:");
Type^ definedType = Dictionary<String^, Test^>::typeid;
Console::WriteLine("\tAre the constructed types "
"equal? {0}", definedType == constructedType);
Console::WriteLine("\tAre the generic types equal? {0}",
definedType->GetGenericTypeDefinition() == genericType);
}
private:
static void DisplayTypeInfo(Type^ typeToDisplay)
{
Console::WriteLine("\r\n{0}", typeToDisplay);
Console::WriteLine("\tIs this a generic type definition? "
"{0}", typeToDisplay->IsGenericTypeDefinition);
Console::WriteLine("\tIs it a generic type? "
"{0}", typeToDisplay->IsGenericType);
array<Type^>^ typeArguments =
typeToDisplay->GetGenericArguments();
Console::WriteLine("\tList type arguments ({0}):",
typeArguments->Length);
for each (Type^ typeArgument in typeArguments)
{
Console::WriteLine("\t\t{0}", typeArgument);
}
}
};
}
int main(void)
{
Example::Test::CreateConstructedType();
}
/* This example produces the following output:
--- Create a constructed type from the generic Dictionary`2 type.
System.Collections.Generic.Dictionary`2[KeyType,ValueType]
Is this a generic type definition? True
Is it a generic type? True
List type arguments (2):
K
V
System.Collections.Generic.Dictionary`2[System.String, Test]
Is this a generic type definition? False
Is it a generic type? True
List type arguments (2):
System.String
Test
--- Compare types obtained by different methods:
Are the constructed types equal? True
Are the generic types equal? True
*/
using System;
using System.Reflection;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
Console.WriteLine("\r\n--- Create a constructed type from the generic Dictionary type.");
// Create a type object representing the generic Dictionary
// type, by omitting the type arguments (but keeping the
// comma that separates them, so the compiler can infer the
// number of type parameters).
Type generic = typeof(Dictionary<,>);
DisplayTypeInfo(generic);
// Create an array of types to substitute for the type
// parameters of Dictionary. The key is of type string, and
// the type to be contained in the Dictionary is Test.
Type[] typeArgs = { typeof(string), typeof(Test) };
// Create a Type object representing the constructed generic
// type.
Type constructed = generic.MakeGenericType(typeArgs);
DisplayTypeInfo(constructed);
// Compare the type objects obtained above to type objects
// obtained using typeof() and GetGenericTypeDefinition().
Console.WriteLine("\r\n--- Compare types obtained by different methods:");
Type t = typeof(Dictionary<String, Test>);
Console.WriteLine("\tAre the constructed types equal? {0}", t == constructed);
Console.WriteLine("\tAre the generic types equal? {0}",
t.GetGenericTypeDefinition() == generic);
}
private static void DisplayTypeInfo(Type t)
{
Console.WriteLine("\r\n{0}", t);
Console.WriteLine("\tIs this a generic type definition? {0}",
t.IsGenericTypeDefinition);
Console.WriteLine("\tIs it a generic type? {0}",
t.IsGenericType);
Type[] typeArguments = t.GetGenericArguments();
Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
foreach (Type tParam in typeArguments)
{
Console.WriteLine("\t\t{0}", tParam);
}
}
}
/* This example produces the following output:
--- Create a constructed type from the generic Dictionary type.
System.Collections.Generic.Dictionary`2[TKey,TValue]
Is this a generic type definition? True
Is it a generic type? True
List type arguments (2):
TKey
TValue
System.Collections.Generic.Dictionary`2[System.String, Test]
Is this a generic type definition? False
Is it a generic type? True
List type arguments (2):
System.String
Test
--- Compare types obtained by different methods:
Are the constructed types equal? True
Are the generic types equal? True
*/
open System
open System.Collections.Generic
type Test() = class end
let displayTypeInfo (t: Type) =
printfn $"\r\n{t}"
printfn $"\tIs this a generic type definition? {t.IsGenericTypeDefinition}"
printfn $"\tIs it a generic type? {t.IsGenericType}"
let typeArguments = t.GetGenericArguments()
printfn $"\tList type arguments ({typeArguments.Length}):"
for tParam in typeArguments do
printfn $"\t\t{tParam}"
printfn "\r\n--- Create a constructed type from the generic Dictionary type."
// Create a type object representing the generic Dictionary
// type, by calling .GetGenericTypeDefinition().
let generic = typeof<Dictionary<_,_>>.GetGenericTypeDefinition()
displayTypeInfo generic
// Create an array of types to substitute for the type
// parameters of Dictionary. The key is of type string, and
// the type to be contained in the Dictionary is Test.
let typeArgs = [| typeof<string>; typeof<Test> |]
// Create a Type object representing the constructed generic type.
let constructed = generic.MakeGenericType typeArgs
displayTypeInfo constructed
(* This example produces the following output:
--- Create a constructed type from the generic Dictionary type.
System.Collections.Generic.Dictionary`2[TKey,TValue]
Is this a generic type definition? True
Is it a generic type? True
List type arguments (2):
TKey
TValue
System.Collections.Generic.Dictionary`2[System.String, Test]
Is this a generic type definition? False
Is it a generic type? True
List type arguments (2):
System.String
Test
*)
Imports System.Reflection
Imports System.Collections.Generic
Public Class Test
Public Shared Sub Main()
Console.WriteLine(vbCrLf & "--- Create a constructed type from the generic Dictionary type.")
' Create a type object representing the generic Dictionary
' type, by omitting the type arguments (but keeping the
' comma that separates them, so the compiler can infer the
' number of type parameters).
Dim generic As Type = GetType(Dictionary(Of ,))
DisplayTypeInfo(generic)
' Create an array of types to substitute for the type
' parameters of Dictionary. The key is of type string, and
' the type to be contained in the Dictionary is Test.
Dim typeArgs() As Type = { GetType(String), GetType(Test) }
' Create a Type object representing the constructed generic
' type.
Dim constructed As Type = generic.MakeGenericType(typeArgs)
DisplayTypeInfo(constructed)
' Compare the type objects obtained above to type objects
' obtained using GetType() and GetGenericTypeDefinition().
Console.WriteLine(vbCrLf & "--- Compare types obtained by different methods:")
Dim t As Type = GetType(Dictionary(Of String, Test))
Console.WriteLine(vbTab & "Are the constructed types equal? " _
& (t Is constructed))
Console.WriteLine(vbTab & "Are the generic types equal? " _
& (t.GetGenericTypeDefinition() Is generic))
End Sub
Private Shared Sub DisplayTypeInfo(ByVal t As Type)
Console.WriteLine(vbCrLf & t.ToString())
Console.WriteLine(vbTab & "Is this a generic type definition? " _
& t.IsGenericTypeDefinition)
Console.WriteLine(vbTab & "Is it a generic type? " _
& t.IsGenericType)
Dim typeArguments() As Type = t.GetGenericArguments()
Console.WriteLine(vbTab & "List type arguments ({0}):", _
typeArguments.Length)
For Each tParam As Type In typeArguments
Console.WriteLine(vbTab & vbTab & tParam.ToString())
Next
End Sub
End Class
' This example produces the following output:
'
'--- Create a constructed type from the generic Dictionary type.
'
'System.Collections.Generic.Dictionary'2[TKey,TValue]
' Is this a generic type definition? True
' Is it a generic type? True
' List type arguments (2):
' TKey
' TValue
'
'System.Collections.Generic.Dictionary`2[System.String,Test]
' Is this a generic type definition? False
' Is it a generic type? True
' List type arguments (2):
' System.String
' Test
'
'--- Compare types obtained by different methods:
' Are the constructed types equal? True
' Are the generic types equal? True
備註
如需此 API 的詳細資訊,請參閱 Type.MakeGenericType 的補充 API 備註。