MethodInfo.MakeGenericMethod(Type[]) Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Vervangt de elementen van een matrix met typen voor de typeparameters van de huidige algemene methodedefinitie en retourneert een MethodInfo object dat de resulterende samengestelde methode vertegenwoordigt.
public:
virtual System::Reflection::MethodInfo ^ MakeGenericMethod(... cli::array <Type ^> ^ typeArguments);
public virtual System.Reflection.MethodInfo MakeGenericMethod(params Type[] typeArguments);
abstract member MakeGenericMethod : Type[] -> System.Reflection.MethodInfo
override this.MakeGenericMethod : Type[] -> System.Reflection.MethodInfo
Public Overridable Function MakeGenericMethod (ParamArray typeArguments As Type()) As MethodInfo
Parameters
- typeArguments
- Type[]
Een matrix van typen die moeten worden vervangen door de typeparameters van de huidige algemene methodedefinitie.
Retouren
Een MethodInfo object dat de samengestelde methode vertegenwoordigt die wordt gevormd door de elementen van typeArguments de typeparameters van de huidige algemene methodedefinitie te vervangen.
Uitzonderingen
De huidige MethodInfo vertegenwoordigt geen algemene methodedefinitie. Dat wil gezegd, IsGenericMethodDefinition retourneert false.
Het aantal elementen in typeArguments is niet hetzelfde als het aantal typeparameters van de huidige algemene methodedefinitie.
– of –
Een element van typeArguments de methode voldoet niet aan de beperkingen die zijn opgegeven voor de overeenkomstige typeparameter van de huidige algemene methodedefinitie.
Deze methode wordt niet ondersteund.
Voorbeelden
In het volgende codevoorbeeld ziet u de eigenschappen en methoden waarmee MethodInfo het onderzoek van algemene methoden wordt ondersteund. In het voorbeeld doet u het volgende:
- Definieert een klasse met een algemene methode.
- Hiermee maakt u een MethodInfo die de algemene methode vertegenwoordigt.
- Geeft eigenschappen weer van de algemene methodedefinitie.
- Hiermee wijst u typeargumenten toe aan de typeparameters van de MethodInfoen roept u de resulterende samengestelde algemene methode aan.
- Geeft eigenschappen weer van de samengestelde algemene methode.
- Haalt de algemene methodedefinitie op uit de samengestelde methode en vergelijkt deze met de oorspronkelijke definitie.
using System;
using System.Reflection;
// Define a class with a generic method.
public class Example
{
public static void Generic<T>(T toDisplay)
{
Console.WriteLine("\r\nHere it is: {0}", toDisplay);
}
}
public class Test
{
public static void Main()
{
Console.WriteLine("\r\n--- Examine a generic method.");
// Create a Type object representing class Example, and
// get a MethodInfo representing the generic method.
//
Type ex = typeof(Example);
MethodInfo mi = ex.GetMethod("Generic");
DisplayGenericMethodInfo(mi);
// Assign the int type to the type parameter of the Example
// method.
//
MethodInfo miConstructed = mi.MakeGenericMethod(typeof(int));
DisplayGenericMethodInfo(miConstructed);
// Invoke the method.
object[] args = {42};
miConstructed.Invoke(null, args);
// Invoke the method normally.
Example.Generic<int>(42);
// Get the generic type definition from the closed method,
// and show it's the same as the original definition.
//
MethodInfo miDef = miConstructed.GetGenericMethodDefinition();
Console.WriteLine("\r\nThe definition is the same: {0}",
miDef == mi);
}
private static void DisplayGenericMethodInfo(MethodInfo mi)
{
Console.WriteLine("\r\n{0}", mi);
Console.WriteLine("\tIs this a generic method definition? {0}",
mi.IsGenericMethodDefinition);
Console.WriteLine("\tIs it a generic method? {0}",
mi.IsGenericMethod);
Console.WriteLine("\tDoes it have unassigned generic parameters? {0}",
mi.ContainsGenericParameters);
// If this is a generic method, display its type arguments.
//
if (mi.IsGenericMethod)
{
Type[] typeArguments = mi.GetGenericArguments();
Console.WriteLine("\tList type arguments ({0}):",
typeArguments.Length);
foreach (Type tParam in typeArguments)
{
// IsGenericParameter is true only for generic type
// parameters.
//
if (tParam.IsGenericParameter)
{
Console.WriteLine("\t\t{0} parameter position {1}" +
"\n\t\t declaring method: {2}",
tParam,
tParam.GenericParameterPosition,
tParam.DeclaringMethod);
}
else
{
Console.WriteLine("\t\t{0}", tParam);
}
}
}
}
}
/* This example produces the following output:
--- Examine a generic method.
Void Generic[T](T)
Is this a generic method definition? True
Is it a generic method? True
Does it have unassigned generic parameters? True
List type arguments (1):
T parameter position 0
declaring method: Void Generic[T](T)
Void Generic[Int32](Int32)
Is this a generic method definition? False
Is it a generic method? True
Does it have unassigned generic parameters? False
List type arguments (1):
System.Int32
Here it is: 42
Here it is: 42
The definition is the same: True
*/
Imports System.Reflection
' Define a class with a generic method.
Public Class Example
Public Shared Sub Generic(Of T)(ByVal toDisplay As T)
Console.WriteLine(vbCrLf & "Here it is: {0}", toDisplay)
End Sub
End Class
Public Class Test
Public Shared Sub Main()
Console.WriteLine(vbCrLf & "--- Examine a generic method.")
' Create a Type object representing class Example, and
' get a MethodInfo representing the generic method.
'
Dim ex As Type = GetType(Example)
Dim mi As MethodInfo = ex.GetMethod("Generic")
DisplayGenericMethodInfo(mi)
' Assign the Integer type to the type parameter of the Example
' method.
'
Dim arguments() As Type = { GetType(Integer) }
Dim miConstructed As MethodInfo = mi.MakeGenericMethod(arguments)
DisplayGenericMethodInfo(miConstructed)
' Invoke the method.
Dim args() As Object = { 42 }
miConstructed.Invoke(Nothing, args)
' Invoke the method normally.
Example.Generic(Of Integer)(42)
' Get the generic type definition from the constructed method,
' and show that it's the same as the original definition.
'
Dim miDef As MethodInfo = miConstructed.GetGenericMethodDefinition()
Console.WriteLine(vbCrLf & "The definition is the same: {0}", _
miDef Is mi)
End Sub
Private Shared Sub DisplayGenericMethodInfo(ByVal mi As MethodInfo)
Console.WriteLine(vbCrLf & mi.ToString())
Console.WriteLine(vbTab _
& "Is this a generic method definition? {0}", _
mi.IsGenericMethodDefinition)
Console.WriteLine(vbTab & "Is it a generic method? {0}", _
mi.IsGenericMethod)
Console.WriteLine(vbTab _
& "Does it have unassigned generic parameters? {0}", _
mi.ContainsGenericParameters)
' If this is a generic method, display its type arguments.
'
If mi.IsGenericMethod Then
Dim typeArguments As Type() = mi.GetGenericArguments()
Console.WriteLine(vbTab & "List type arguments ({0}):", _
typeArguments.Length)
For Each tParam As Type In typeArguments
' IsGenericParameter is true only for generic type
' parameters.
'
If tParam.IsGenericParameter Then
Console.WriteLine(vbTab & vbTab _
& "{0} parameter position: {1}" _
& vbCrLf & vbTab & vbTab _
& " declaring method: {2}", _
tParam, _
tParam.GenericParameterPosition, _
tParam.DeclaringMethod)
Else
Console.WriteLine(vbTab & vbTab & tParam.ToString())
End If
Next tParam
End If
End Sub
End Class
' This example produces the following output:
'
'--- Examine a generic method.
'
'Void Generic[T](T)
' Is this a generic method definition? True
' Is it a generic method? True
' Does it have unassigned generic parameters? True
' List type arguments (1):
' T parameter position: 0
' declaring method: Void Generic[T](T)
'
'Void Generic[Int32](Int32)
' Is this a generic method definition? False
' Is it a generic method? True
' Does it have unassigned generic parameters? False
' List type arguments (1):
' System.Int32
'
'Here it is: 42
'
'Here it is: 42
'
'The definition is the same: True
'
Opmerkingen
Met MakeGenericMethod de methode kunt u code schrijven waarmee specifieke typen worden toegewezen aan de typeparameters van een algemene methodedefinitie, waardoor u een MethodInfo object maakt dat een bepaalde samengestelde methode vertegenwoordigt. Als de ContainsGenericParameters eigenschap van dit MethodInfo object wordt geretourneerd true, kunt u deze gebruiken om de methode aan te roepen of om een gemachtigde te maken om de methode aan te roepen.
Methoden die zijn samengesteld met de MakeGenericMethod methode kunnen open zijn, dat wil gezegd, sommige van hun typeargumenten kunnen typeparameters zijn van het insluiten van algemene typen. U kunt dergelijke open samengestelde methoden gebruiken wanneer u dynamische assembly's genereert. Denk bijvoorbeeld aan de volgende code.
class C
{
T N<T,U>(T t, U u) {...}
public V M<V>(V v)
{
return N<V,int>(v, 42);
}
}
Class C
Public Function N(Of T,U)(ByVal ta As T, ByVal ua As U) As T
...
End Function
Public Function M(Of V)(ByVal va As V ) As V
Return N(Of V, Integer)(va, 42)
End Function
End Class
De hoofdtekst van M de methode bevat een aanroep naar methode N, waarbij de typeparameter M en het type Int32worden opgegeven. De IsGenericMethodDefinition eigenschap retourneert false voor methode N<V,int>. De ContainsGenericParameters eigenschap retourneert true, zodat de methode N<V,int> niet kan worden aangeroepen.
Zie de IsGenericMethod eigenschap voor een lijst met invariante voorwaarden voor voorwaarden die specifiek zijn voor algemene methoden. Zie de IsGenericType eigenschap voor een lijst met de invariante voorwaarden voor andere termen die in algemene reflectie worden gebruikt.