MethodBuilder.MakeGenericMethod(Type[]) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Retorna um método genérico construído da definição de método genérico atual usando os argumentos de tipo genérico especificados.
public:
override System::Reflection::MethodInfo ^ MakeGenericMethod(... cli::array <Type ^> ^ typeArguments);
public override System.Reflection.MethodInfo MakeGenericMethod (params Type[] typeArguments);
override this.MakeGenericMethod : Type[] -> System.Reflection.MethodInfo
Public Overrides Function MakeGenericMethod (ParamArray typeArguments As Type()) As MethodInfo
Parâmetros
- typeArguments
- Type[]
Uma matriz de objetos Type que representam os argumentos de tipo para o método genérico.
Retornos
Um MethodInfo que representa o método genérico construído com base na definição de método genérico atual usando os argumentos de tipo genérico especificados.
Exemplos
O exemplo de código a seguir cria um método construído com base em uma definição de método genérico incompleta em um tipo incompleto.
O exemplo cria um assembly transitório e um módulo com um único tipo, adiciona um método M
e torna o método genérico adicionando um parâmetro de tipo T usando o DefineGenericParameters método . O parâmetro de tipo é usado como o tipo do parâmetro do método e também como seu tipo de retorno. A definição de método genérico não recebe um corpo e o tipo delimitador não é concluído. Em MakeGenericMethod seguida, o método é usado para criar o método M<String>
construído (M(Of String)
no Visual Basic). O código de exemplo não tem saída, pois a subclasse de MethodInfo retornada pelo MakeGenericMethod método não permite reflexão sobre seus parâmetros.
Observação
Para obter outro exemplo de código que usa MakeGenericMethod, consulte DefineGenericParameters. MakeGenericMethod também é usado extensivamente ao emitir código que usa tipos genéricos. Consulte Como definir um método genérico com a emissão de reflexão.
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
void main()
{
// Define a transient dynamic assembly (only to run, not
// to save) with one module and a type "Test".
//
AssemblyName^ aName = gcnew AssemblyName("MyDynamic");
AssemblyBuilder^ ab =
AppDomain::CurrentDomain->DefineDynamicAssembly(
aName,
AssemblyBuilderAccess::Run);
ModuleBuilder^ mb = ab->DefineDynamicModule(aName->Name);
TypeBuilder^ tb = mb->DefineType("Test");
// Add a public static method "M" to Test, and make it a
// generic method with one type parameter named "T").
//
MethodBuilder^ meb = tb->DefineMethod("M",
MethodAttributes::Public | MethodAttributes::Static);
array<GenericTypeParameterBuilder^>^ typeParams =
meb->DefineGenericParameters(gcnew array<String^> { "T" });
// Give the method one parameter, of type T, and a
// return type of T.
meb->SetParameters(typeParams);
meb->SetReturnType(typeParams[0]);
// Create a MethodInfo for M<string>, which can be used in
// emitted code. This is possible even though the method
// does not yet have a body, and the enclosing type is not
// created.
MethodInfo^ mi = meb->MakeGenericMethod(String::typeid);
// Note that this is actually a subclass of MethodInfo,
// which has rather limited capabilities -- for
// example, you cannot reflect on its parameters.
}
using System;
using System.Reflection;
using System.Reflection.Emit;
class Example
{
public static void Main()
{
// Define a transient dynamic assembly (only to run, not
// to save) with one module and a type "Test".
//
AssemblyName aName = new AssemblyName("MyDynamic");
AssemblyBuilder ab =
AppDomain.CurrentDomain.DefineDynamicAssembly(
aName,
AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
TypeBuilder tb = mb.DefineType("Test");
// Add a public static method "M" to Test, and make it a
// generic method with one type parameter named "T").
//
MethodBuilder meb = tb.DefineMethod("M",
MethodAttributes.Public | MethodAttributes.Static);
GenericTypeParameterBuilder[] typeParams =
meb.DefineGenericParameters(new string[] { "T" });
// Give the method one parameter, of type T, and a
// return type of T.
meb.SetParameters(typeParams);
meb.SetReturnType(typeParams[0]);
// Create a MethodInfo for M<string>, which can be used in
// emitted code. This is possible even though the method
// does not yet have a body, and the enclosing type is not
// created.
MethodInfo mi = meb.MakeGenericMethod(typeof(string));
// Note that this is actually a subclass of MethodInfo,
// which has rather limited capabilities -- for
// example, you cannot reflect on its parameters.
}
}
Imports System.Reflection
Imports System.Reflection.Emit
Class Example
Public Shared Sub Main()
' Define a transient dynamic assembly (only to run, not
' to save) with one module and a type "Test".
'
Dim aName As AssemblyName = New AssemblyName("MyDynamic")
Dim ab As AssemblyBuilder = _
AppDomain.CurrentDomain.DefineDynamicAssembly( _
aName, _
AssemblyBuilderAccess.Run)
Dim mb As ModuleBuilder = ab.DefineDynamicModule(aName.Name)
Dim tb As TypeBuilder = mb.DefineType("Test")
' Add a Public Shared method "M" to Test, and make it a
' generic method with one type parameter named "T").
'
Dim meb As MethodBuilder = tb.DefineMethod("M", _
MethodAttributes.Public Or MethodAttributes.Static)
Dim typeParams() As GenericTypeParameterBuilder = _
meb.DefineGenericParameters(New String() { "T" })
' Give the method one parameter, of type T, and a
' return type of T.
meb.SetParameters(typeParams)
meb.SetReturnType(typeParams(0))
' Create a MethodInfo for M(Of String), which can be used
' in emitted code. This is possible even though the method
' does not yet have a body, and the enclosing type is not
' created.
Dim mi As MethodInfo = _
meb.MakeGenericMethod(GetType(String))
' Note that this is actually a subclass of MethodInfo,
' which has rather limited capabilities -- for
' example, you cannot reflect on its parameters.
End Sub
End Class
Comentários
Ao emitir código dinâmico, talvez seja necessário emitir uma chamada para um método construído a partir da definição de método genérico representada por um MethodBuilder, antes que o tipo delimitador seja concluído. Você pode usar o MakeGenericMethod método para criar um MethodInfo para esse método construído e usar o MethodInfo na chamada emitida.