TypeBuilder.DefineMethod Método

Definição

Adiciona um método ao tipo.

Sobrecargas

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][])

Adiciona um novo método ao tipo, com o nome, os atributos de método, a convenção de chamada, a assinatura de método e os modificadores personalizados especificados.

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[])

Adiciona um novo método ao tipo, com o nome, atributos de método, convenção de chamada e assinatura de método especificados.

DefineMethod(String, MethodAttributes, CallingConventions)

Adiciona um novo método ao tipo, com o nome, os atributos de método e a convenção de chamada especificados.

DefineMethod(String, MethodAttributes)

Adiciona um novo método ao tipo, com o nome e os atributos de método especificados.

DefineMethod(String, MethodAttributes, Type, Type[])

Adiciona um novo método ao tipo, com o nome, os atributos de método e a assinatura de método especificados.

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][])

Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs

Adiciona um novo método ao tipo, com o nome, os atributos de método, a convenção de chamada, a assinatura de método e os modificadores personalizados especificados.

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? returnTypeRequiredCustomModifiers, Type[]? returnTypeOptionalCustomModifiers, Type[]? parameterTypes, Type[][]? parameterTypeRequiredCustomModifiers, Type[][]? parameterTypeOptionalCustomModifiers);
C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers);

Parâmetros

name
String

O nome do método. name não pode conter nulos inseridos.

attributes
MethodAttributes

Os atributos do método.

callingConvention
CallingConventions

A convenção de chamada do método.

returnType
Type

O tipo de retorno do método.

returnTypeRequiredCustomModifiers
Type[]

Uma matriz de tipos que representam os modificadores personalizados obrigatórios, por exemplo IsConst, para o tipo de retorno do método. Se o tipo de retorno não tiver modificadores personalizados obrigatórios, especifique null.

returnTypeOptionalCustomModifiers
Type[]

Uma matriz de tipos que representam os modificadores personalizados opcionais, por exemplo IsConst, para o tipo de retorno do método. Se o tipo de retorno não tiver modificadores personalizados opcionais, especifique null.

parameterTypes
Type[]

Os tipos dos parâmetros do método.

parameterTypeRequiredCustomModifiers
Type[][]

Uma matriz de matrizes de tipos. Cada matriz de tipos representa os modificadores personalizados obrigatórios para o parâmetro correspondente, por exemplo IsConst. Se um determinado parâmetro tiver não modificadores personalizados obrigatórios, especifique null em vez de uma matriz de tipos. Se nenhum dos parâmetros tiver modificadores personalizados obrigatórios, especifique null em vez de uma matriz de matrizes.

parameterTypeOptionalCustomModifiers
Type[][]

Uma matriz de matrizes de tipos. Cada matriz de tipos representa os modificadores personalizados opcionais para o parâmetro correspondente, por exemplo IsConst. Se um determinado parâmetro tiver não modificadores personalizados opcionais, especifique null em vez de uma matriz de tipos. Se nenhum dos parâmetros tiver modificadores personalizados opcionais, especifique null em vez de uma matriz de matrizes.

Retornos

Um objeto MethodBuilder que representa o método recém-adicionado.

Exceções

O comprimento de name é zero.

- ou -

O tipo de pai desse método é uma interface e esse método não é virtual (Overridable no Visual Basic).

- ou -

O tamanho de parameterTypeRequiredCustomModifiers ou parameterTypeOptionalCustomModifiers não é igual ao tamanho de parameterTypes.

name é null.

O tipo foi criado anteriormente usando CreateType().

- ou -

Para o tipo dinâmico atual, a propriedade IsGenericType é true, mas a propriedade IsGenericTypeDefinition é false.

Comentários

Use essa sobrecarga se precisar especificar modificadores personalizados. Se você precisar especificar modificadores personalizados depois que o método tiver sido criado, como você faria, por exemplo, com um método genérico cujos tipos de parâmetro são especificados por seus parâmetros de tipo genérico, você pode usar as DefineMethod(String, MethodAttributes) sobrecargas de método ou DefineMethod(String, MethodAttributes, CallingConventions) para definir o método e, em seguida, usar o MethodBuilder.SetSignature método para definir o parâmetro e retornar tipos com modificadores personalizados.

Observação

Para obter mais informações sobre modificadores personalizados, consulte ECMA C# e Common Language Infrastructure Standards e Standard ECMA-335 – CLI (Common Language Infrastructure).

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[])

Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs

Adiciona um novo método ao tipo, com o nome, atributos de método, convenção de chamada e assinatura de método especificados.

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes);
C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes);

Parâmetros

name
String

O nome do método. name não pode conter nulos inseridos.

attributes
MethodAttributes

Os atributos do método.

callingConvention
CallingConventions

A convenção de chamada do método.

returnType
Type

O tipo de retorno do método.

parameterTypes
Type[]

Os tipos dos parâmetros do método.

Retornos

Um MethodBuilder representando o método recém-definido.

Exceções

O comprimento de name é zero.

- ou -

O tipo de pai desse método é uma interface e esse método não é virtual (Overridable no Visual Basic).

name é null.

O tipo foi criado anteriormente usando CreateType().

- ou -

Para o tipo dinâmico atual, a propriedade IsGenericType é true, mas a propriedade IsGenericTypeDefinition é false.

Exemplos

O exemplo de código a seguir demonstra o uso de DefineMethod para definir a assinatura e os atributos específicos de um construtor em um tipo dinâmico e retornar um correspondente MethodBuilder para a população msil.

C#
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;

public interface IMyInterface
{
   String HelloMethod(String parameter);
}

public class Example
{
   public static void Main()
   {
      Type myNestedClassType = CreateCallee(Thread.GetDomain());
      // Cretae an instance of 'MyNestedClass'.
      IMyInterface myInterface =
         (IMyInterface)Activator.CreateInstance(myNestedClassType);
      Console.WriteLine(myInterface.HelloMethod("Bill"));
   }

   // Create the callee transient dynamic assembly.
   private static Type CreateCallee(AppDomain myAppDomain)
   {
      AssemblyName myAssemblyName = new AssemblyName();
      myAssemblyName.Name = "Example";
      // Create the callee dynamic assembly.
      AssemblyBuilder myAssembly =
         myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
      // Create a dynamic module in the callee assembly.
      ModuleBuilder myModule = myAssembly.DefineDynamicModule("EmittedModule");
      // Define a public class named "MyHelloWorld".
      TypeBuilder myHelloWorldType =
         myModule.DefineType("MyHelloWorld", TypeAttributes.Public);
      // Define a public nested class named 'MyNestedClass'.
      TypeBuilder myNestedClassType =
         myHelloWorldType.DefineNestedType("MyNestedClass",
            TypeAttributes.NestedPublic, typeof(Example),
            new Type[]{typeof(IMyInterface)});
      // Implement 'IMyInterface' interface.
      myNestedClassType.AddInterfaceImplementation(typeof(IMyInterface));
      // Define 'HelloMethod' of 'IMyInterface'.
      MethodBuilder myHelloMethod =
         myNestedClassType.DefineMethod("HelloMethod",
            MethodAttributes.Public | MethodAttributes.Virtual,
            typeof(String), new Type[]{typeof(String)});
      // Generate IL for 'GetGreeting' method.
      ILGenerator myMethodIL = myHelloMethod.GetILGenerator();
      myMethodIL.Emit(OpCodes.Ldstr, "Hi! ");
      myMethodIL.Emit(OpCodes.Ldarg_1);
      MethodInfo infoMethod =
         typeof(String).GetMethod("Concat",new Type[]{typeof(string),typeof(string)});
      myMethodIL.Emit(OpCodes.Call, infoMethod);
      myMethodIL.Emit(OpCodes.Ret);

      MethodInfo myHelloMethodInfo =
         typeof(IMyInterface).GetMethod("HelloMethod");
      // Implement 'HelloMethod' of 'IMyInterface'.
      myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo);
      // Create 'MyHelloWorld' type.
      Type myType = myHelloWorldType.CreateType();
      // Create 'MyNestedClass' type.
      return myNestedClassType.CreateType();
   }
}

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes, CallingConventions)

Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs

Adiciona um novo método ao tipo, com o nome, os atributos de método e a convenção de chamada especificados.

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention);

Parâmetros

name
String

O nome do método. name não pode conter nulos inseridos.

attributes
MethodAttributes

Os atributos do método.

callingConvention
CallingConventions

A convenção de chamada do método.

Retornos

Um MethodBuilder representando o método recém-definido.

Exceções

O comprimento de name é zero.

- ou -

O tipo de pai desse método é uma interface e esse método não é virtual (Overridable no Visual Basic).

name é null.

O tipo foi criado anteriormente usando CreateType().

- ou -

Para o tipo dinâmico atual, a propriedade IsGenericType é true, mas a propriedade IsGenericTypeDefinition é false.

Comentários

Use essa sobrecarga de método quando você não souber a assinatura do método no momento em que definir o método. Por exemplo, os tipos de parâmetro e o tipo de retorno de um método genérico podem ser especificados pelos parâmetros de tipo genérico do método, que devem ser definidos após o método ter sido adicionado ao tipo. Os parâmetros e o tipo de retorno do método podem ser definidos posteriormente usando o MethodBuilder.SetSignature método .

Confira também

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes)

Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs

Adiciona um novo método ao tipo, com o nome e os atributos de método especificados.

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes);

Parâmetros

name
String

O nome do método. name não pode conter nulos inseridos.

attributes
MethodAttributes

Os atributos do método.

Retornos

Um MethodBuilder representando o método recém-definido.

Exceções

O comprimento de name é zero.

- ou -

O tipo de pai desse método é uma interface e esse método não é virtual (Overridable no Visual Basic).

name é null.

O tipo foi criado anteriormente usando CreateType().

- ou -

Para o tipo dinâmico atual, a propriedade IsGenericType é true, mas a propriedade IsGenericTypeDefinition é false.

Exemplos

O exemplo de código a seguir define um método genérico chamado DemoMethod cujo tipo de parâmetro e tipo de retorno são especificados por seus parâmetros de tipo genérico. O método é definido sem uma assinatura, usando a convenção de chamada padrão. O MethodBuilder.DefineGenericParameters método é usado para criar DemoMethod um método genérico e os parâmetros de tipo recém-definidos são usados para o tipo de assinatura e retorno.

Este exemplo de código faz parte de um exemplo maior fornecido para o DefineGenericParameters método .

C#
// Define a Shared, Public method with standard calling
// conventions. Do not specify the parameter types or the
// return type, because type parameters will be used for
// those types, and the type parameters have not been
// defined yet.
MethodBuilder demoMethod = demoType.DefineMethod(
    "DemoMethod",
    MethodAttributes.Public | MethodAttributes.Static
);
C#
// Defining generic parameters for the method makes it a
// generic method. By convention, type parameters are
// single alphabetic characters. T and U are used here.
//
string[] typeParamNames = {"T", "U"};
GenericTypeParameterBuilder[] typeParameters =
    demoMethod.DefineGenericParameters(typeParamNames);

// The second type parameter is constrained to be a
// reference type.
typeParameters[1].SetGenericParameterAttributes(
    GenericParameterAttributes.ReferenceTypeConstraint);
C#
// Set parameter types for the method. The method takes
// one parameter, and its type is specified by the first
// type parameter, T.
Type[] parms = {typeParameters[0]};
demoMethod.SetParameters(parms);

// Set the return type for the method. The return type is
// specified by the second type parameter, U.
demoMethod.SetReturnType(typeParameters[1]);

Comentários

Use essa sobrecarga de método quando você não souber a assinatura do método no momento em que definir o método. Por exemplo, os tipos de parâmetro e o tipo de retorno de um método genérico podem ser especificados pelos parâmetros de tipo genérico do método, que devem ser definidos após o método ter sido adicionado ao tipo. Os parâmetros e o tipo de retorno do método podem ser definidos posteriormente usando o MethodBuilder.SetSignature método .

Essa sobrecarga de método define um método com CallingConventions.Standard. Se você precisar definir um método sem uma assinatura, com uma convenção de chamada diferente, use a sobrecarga do DefineMethod(String, MethodAttributes, CallingConventions) método.

Confira também

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

DefineMethod(String, MethodAttributes, Type, Type[])

Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs
Origem:
TypeBuilder.cs

Adiciona um novo método ao tipo, com o nome, os atributos de método e a assinatura de método especificados.

C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, Type? returnType, Type[]? parameterTypes);
C#
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, Type returnType, Type[] parameterTypes);

Parâmetros

name
String

O nome do método. name não pode conter nulos inseridos.

attributes
MethodAttributes

Os atributos do método.

returnType
Type

O tipo de retorno do método.

parameterTypes
Type[]

Os tipos dos parâmetros do método.

Retornos

O método definido.

Exceções

O comprimento de name é zero.

- ou -

O tipo de pai desse método é uma interface e esse método não é virtual (Overridable no Visual Basic).

name é null.

O tipo foi criado anteriormente usando CreateType().

- ou -

Para o tipo dinâmico atual, a propriedade IsGenericType é true, mas a propriedade IsGenericTypeDefinition é false.

Exemplos

O exemplo de código a seguir demonstra o uso de DefineMethod para definir a assinatura e os atributos específicos de um construtor em um tipo dinâmico e retornar um correspondente MethodBuilder para a população msil.

C#
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;

public interface IMyInterface
{
   String HelloMethod(String parameter);
}

public class Example
{
   public static void Main()
   {
      Type myNestedClassType = CreateCallee(Thread.GetDomain());
      // Cretae an instance of 'MyNestedClass'.
      IMyInterface myInterface =
         (IMyInterface)Activator.CreateInstance(myNestedClassType);
      Console.WriteLine(myInterface.HelloMethod("Bill"));
   }

   // Create the callee transient dynamic assembly.
   private static Type CreateCallee(AppDomain myAppDomain)
   {
      AssemblyName myAssemblyName = new AssemblyName();
      myAssemblyName.Name = "Example";
      // Create the callee dynamic assembly.
      AssemblyBuilder myAssembly =
         myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
      // Create a dynamic module in the callee assembly.
      ModuleBuilder myModule = myAssembly.DefineDynamicModule("EmittedModule");
      // Define a public class named "MyHelloWorld".
      TypeBuilder myHelloWorldType =
         myModule.DefineType("MyHelloWorld", TypeAttributes.Public);
      // Define a public nested class named 'MyNestedClass'.
      TypeBuilder myNestedClassType =
         myHelloWorldType.DefineNestedType("MyNestedClass",
            TypeAttributes.NestedPublic, typeof(Example),
            new Type[]{typeof(IMyInterface)});
      // Implement 'IMyInterface' interface.
      myNestedClassType.AddInterfaceImplementation(typeof(IMyInterface));
      // Define 'HelloMethod' of 'IMyInterface'.
      MethodBuilder myHelloMethod =
         myNestedClassType.DefineMethod("HelloMethod",
            MethodAttributes.Public | MethodAttributes.Virtual,
            typeof(String), new Type[]{typeof(String)});
      // Generate IL for 'GetGreeting' method.
      ILGenerator myMethodIL = myHelloMethod.GetILGenerator();
      myMethodIL.Emit(OpCodes.Ldstr, "Hi! ");
      myMethodIL.Emit(OpCodes.Ldarg_1);
      MethodInfo infoMethod =
         typeof(String).GetMethod("Concat",new Type[]{typeof(string),typeof(string)});
      myMethodIL.Emit(OpCodes.Call, infoMethod);
      myMethodIL.Emit(OpCodes.Ret);

      MethodInfo myHelloMethodInfo =
         typeof(IMyInterface).GetMethod("HelloMethod");
      // Implement 'HelloMethod' of 'IMyInterface'.
      myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo);
      // Create 'MyHelloWorld' type.
      Type myType = myHelloWorldType.CreateType();
      // Create 'MyNestedClass' type.
      return myNestedClassType.CreateType();
   }
}

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1