TypeBuilder.DefineMethod Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Добавляет метод к типу.
Перегрузки
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][]) |
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах, сигнатурой метода и настраиваемыми модификаторами. |
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[]) |
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах и сигнатурой метода. |
DefineMethod(String, MethodAttributes, CallingConventions) |
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах. |
DefineMethod(String, MethodAttributes) |
Добавляет новый метод в тип с указанным именем и атрибутами метода. |
DefineMethod(String, MethodAttributes, Type, Type[]) |
Добавляет новый метод в тип с указанным именем, атрибутами метода и сигнатурой метода. |
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][])
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах, сигнатурой метода и настраиваемыми модификаторами.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ returnTypeRequiredCustomModifiers, cli::array <Type ^> ^ returnTypeOptionalCustomModifiers, cli::array <Type ^> ^ parameterTypes, cli::array <cli::array <Type ^> ^> ^ parameterTypeRequiredCustomModifiers, cli::array <cli::array <Type ^> ^> ^ parameterTypeOptionalCustomModifiers);
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);
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);
member this.DefineMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * Type[] * Type[] * Type[][] * Type[][] -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, returnTypeRequiredCustomModifiers As Type(), returnTypeOptionalCustomModifiers As Type(), parameterTypes As Type(), parameterTypeRequiredCustomModifiers As Type()(), parameterTypeOptionalCustomModifiers As Type()()) As MethodBuilder
Параметры
- name
- String
Имя метода. Параметр name
не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- callingConvention
- CallingConventions
Соглашение о вызовах метода.
- returnType
- Type
Тип возвращаемых данных метода.
- returnTypeRequiredCustomModifiers
- Type[]
Массив типов, представляющих обязательные настраиваемые модификаторы, такие как IsConst, для возвращаемого типа метода. Если возвращаемый тип не содержит требуемых настраиваемых модификаторов, укажите null
.
- returnTypeOptionalCustomModifiers
- Type[]
Массив типов, представляющих необязательные настраиваемые модификаторы, такие как IsConst, для возвращаемого типа метода. Если возвращаемый тип не содержит необязательные настраиваемые модификаторы, укажите null
.
- parameterTypes
- Type[]
Типы параметров метода.
- parameterTypeRequiredCustomModifiers
- Type[][]
Массив массивов типов. Каждый массив типов представляет обязательные настраиваемые модификаторы для соответствующего параметра, такие как IsConst. Если определенный параметр не имеет обязательных настраиваемых модификаторов, укажите null
вместо массива массивов. Если ни один из параметров не имеет обязательных настраиваемых модификаторов, укажите null
вместо массива массивов.
- parameterTypeOptionalCustomModifiers
- Type[][]
Массив массивов типов. Каждый массив типов представляет необязательные настраиваемые модификаторы для соответствующего параметра, такие как IsConst. Если определенный параметр не имеет необязательных настраиваемых модификаторов, укажите null
вместо массива массивов. Если ни один из параметров не имеет необязательных настраиваемых модификаторов, укажите null
вместо массива типов.
Возвращаемое значение
Объект MethodBuilder, представляющий добавленный метод.
Исключения
Длина параметра name
равна нулю.
-или-
Тип родительского элемента данного метода — интерфейс, и этот метод не является виртуальным (Overridable
в Visual Basic).
-или-
Размер parameterTypeRequiredCustomModifiers
или parameterTypeOptionalCustomModifiers
не равен размеру parameterTypes
.
name
имеет значение null
.
Этот тип был создан ранее с помощью CreateType().
-или-
Для текущего динамического типа свойство IsGenericType имеет значение true
, но свойство IsGenericTypeDefinition имеет значение false
.
Комментарии
Используйте эту перегрузку, если необходимо указать пользовательские модификаторы. Если после создания метода необходимо указать настраиваемые модификаторы, как, например, с универсальным методом, типы параметров которого задаются его параметрами универсального типа, можно использовать DefineMethod(String, MethodAttributes) перегрузки метода или DefineMethod(String, MethodAttributes, CallingConventions) для определения метода, а затем использовать MethodBuilder.SetSignature метод для определения параметра и возвращаемых типов с помощью настраиваемых модификаторов.
Примечание
Дополнительные сведения о настраиваемых модификаторах см. в разделах EcMA C# и Common Language Infrastructure Standards and Standard ECMA-335 — COMMON Language Infrastructure (CLI).
Применяется к
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[])
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах и сигнатурой метода.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes);
member this.DefineMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type()) As MethodBuilder
Параметры
- name
- String
Имя метода. Параметр name
не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- callingConvention
- CallingConventions
Соглашение о вызовах метода.
- returnType
- Type
Тип возвращаемых данных метода.
- parameterTypes
- Type[]
Типы параметров метода.
Возвращаемое значение
Объект MethodBuilder, представляющий вновь определенный метод.
Исключения
Длина параметра name
равна нулю.
-или-
Тип родительского элемента данного метода — интерфейс, и этот метод не является виртуальным (Overridable
в Visual Basic).
name
имеет значение null
.
Этот тип был создан ранее с помощью CreateType().
-или-
Для текущего динамического типа свойство IsGenericType имеет значение true
, но свойство IsGenericTypeDefinition имеет значение false
.
Примеры
В следующем примере кода демонстрируется использование для задания конкретной сигнатуры DefineMethod
и атрибутов конструктора для динамического типа и возврата соответствующего MethodBuilder для заполнения MSIL.
using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
public interface class IMyInterface
{
String^ HelloMethod( String^ parameter );
};
public ref class EmittedClass
{
public:
// Because this method calls Activator::CreateInstance,
// it requires full trust.
[System::Security::Permissions::PermissionSetAttribute
(System::Security::Permissions::SecurityAction::Demand, Name = "FullTrust")]
static void Main()
{
Type^ myNestedClassType = CreateCallee( Thread::GetDomain() );
// Create an instance of 'MyNestedClass'.
IMyInterface^ myInterface = dynamic_cast<IMyInterface^>(Activator::CreateInstance( myNestedClassType ));
Console::WriteLine( myInterface->HelloMethod( "Bill" ) );
}
private:
// Create the callee transient dynamic assembly.
static Type^ CreateCallee( AppDomain^ myAppDomain )
{
AssemblyName^ myAssemblyName = gcnew AssemblyName;
myAssemblyName->Name = "EmittedClass";
// 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'.
array<Type^>^temp0 = {IMyInterface::typeid};
TypeBuilder^ myNestedClassType = myHelloWorldType->DefineNestedType( "MyNestedClass", TypeAttributes::NestedPublic, EmittedClass::typeid, temp0 );
// Implement 'IMyInterface' interface.
myNestedClassType->AddInterfaceImplementation( IMyInterface::typeid );
// Define 'HelloMethod' of 'IMyInterface'.
array<Type^>^temp1 = {String::typeid};
MethodBuilder^ myHelloMethod = myNestedClassType->DefineMethod( "HelloMethod", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Virtual), String::typeid, temp1 );
// Generate IL for 'GetGreeting' method.
ILGenerator^ myMethodIL = myHelloMethod->GetILGenerator();
myMethodIL->Emit( OpCodes::Ldstr, "Hi! " );
myMethodIL->Emit( OpCodes::Ldarg_1 );
array<Type^>^temp2 = {String::typeid,String::typeid};
MethodInfo^ infoMethod = String::typeid->GetMethod( "Concat", temp2 );
myMethodIL->Emit( OpCodes::Call, infoMethod );
myMethodIL->Emit( OpCodes::Ret );
MethodInfo^ myHelloMethodInfo = IMyInterface::typeid->GetMethod( "HelloMethod" );
// Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType->DefineMethodOverride( myHelloMethod, myHelloMethodInfo );
// Create 'MyHelloWorld' type.
Type^ myType = myHelloWorldType->CreateType();
// Create 'MyNestedClass' type.
return myNestedClassType->CreateType();
}
};
int main()
{
EmittedClass::Main();
}
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();
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Security.Permissions
Public Interface IMyInterface
Function HelloMethod(parameter As String) As String
End Interface 'IMyInterface
Public Class Example
<PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
Public Shared Sub Main()
Dim myNestedClassType As Type = CreateCallee(Thread.GetDomain())
' Create an instance of 'MyNestedClass'.
Dim myInterface As IMyInterface = _
CType(Activator.CreateInstance(myNestedClassType), IMyInterface)
Console.WriteLine(myInterface.HelloMethod("Bill"))
End Sub
' Create the callee transient dynamic assembly.
Private Shared Function CreateCallee(myAppDomain As AppDomain) As Type
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "Example"
' Create the callee dynamic assembly.
Dim myAssembly As AssemblyBuilder = _
myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run)
' Create a dynamic module in the callee assembly.
Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
' Define a public class named "MyHelloWorld".
Dim myHelloWorldType As TypeBuilder = _
myModule.DefineType("MyHelloWorld", TypeAttributes.Public)
' Define a public nested class named 'MyNestedClass'.
Dim myNestedClassType As TypeBuilder = _
myHelloWorldType.DefineNestedType("MyNestedClass", TypeAttributes.NestedPublic, _
GetType(Example), New Type() {GetType(IMyInterface)})
' Implement 'IMyInterface' interface.
myNestedClassType.AddInterfaceImplementation(GetType(IMyInterface))
' Define 'HelloMethod' of 'IMyInterface'.
Dim myHelloMethod As MethodBuilder = _
myNestedClassType.DefineMethod("HelloMethod", MethodAttributes.Public Or _
MethodAttributes.Virtual, GetType(String), New Type() {GetType(String)})
' Generate IL for 'GetGreeting' method.
Dim myMethodIL As ILGenerator = myHelloMethod.GetILGenerator()
myMethodIL.Emit(OpCodes.Ldstr, "Hi! ")
myMethodIL.Emit(OpCodes.Ldarg_1)
Dim infoMethod As MethodInfo = _
GetType(String).GetMethod("Concat", New Type() {GetType(String), GetType(String)})
myMethodIL.Emit(OpCodes.Call, infoMethod)
myMethodIL.Emit(OpCodes.Ret)
Dim myHelloMethodInfo As MethodInfo = GetType(IMyInterface).GetMethod("HelloMethod")
' Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo)
' Create 'MyHelloWorld' type.
Dim myType As Type = myHelloWorldType.CreateType()
' Create 'MyNestedClass' type.
Return myNestedClassType.CreateType()
End Function 'CreateCallee
End Class
Применяется к
DefineMethod(String, MethodAttributes, CallingConventions)
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention);
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention);
member this.DefineMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, callingConvention As CallingConventions) As MethodBuilder
Параметры
- name
- String
Имя метода. Параметр name
не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- callingConvention
- CallingConventions
Соглашение о вызовах метода.
Возвращаемое значение
Объект MethodBuilder, представляющий вновь определенный метод.
Исключения
Длина параметра name
равна нулю.
-или-
Тип родительского элемента данного метода является интерфейсом, и этот метод не является виртуальным (Overridable
в Visual Basic).
name
имеет значение null
.
Этот тип был создан ранее с помощью CreateType().
-или-
Для текущего динамического типа свойство IsGenericType имеет значение true
, но свойство IsGenericTypeDefinition имеет значение false
.
Комментарии
Используйте эту перегрузку метода, если вы не знаете сигнатуру метода во время определения метода. Например, типы параметров и возвращаемый тип универсального метода могут быть заданы параметрами универсального типа метода, которые должны быть определены после добавления метода к типу. Параметры и тип возвращаемого значения метода можно задать позже с помощью MethodBuilder.SetSignature метода .
См. также раздел
Применяется к
DefineMethod(String, MethodAttributes)
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем и атрибутами метода.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes);
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes);
member this.DefineMethod : string * System.Reflection.MethodAttributes -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes) As MethodBuilder
Параметры
- name
- String
Имя метода. Параметр name
не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
Возвращаемое значение
Объект MethodBuilder, представляющий вновь определенный метод.
Исключения
Длина параметра name
равна нулю.
-или-
Тип родительского элемента данного метода — интерфейс, и этот метод не является виртуальным (Overridable
в Visual Basic).
name
имеет значение null
.
Этот тип был создан ранее с помощью CreateType().
-или-
Для текущего динамического типа свойство IsGenericType имеет значение true
, но свойство IsGenericTypeDefinition имеет значение false
.
Примеры
В следующем примере кода определяется универсальный метод с именем DemoMethod
, тип параметра и тип возвращаемого значения задаются параметрами универсального типа. Метод определяется без сигнатуры, используя стандартное соглашение о вызовах. Метод MethodBuilder.DefineGenericParameters используется для создания DemoMethod
универсального метода, а новые параметры типа используются для сигнатуры и возвращаемого типа.
Этот пример кода является частью более крупного примера, предоставленного DefineGenericParameters для метода .
// 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^ sampleMethodBuilder =
sampleTypeBuilder->DefineMethod("SampleMethod",
MethodAttributes::Public | MethodAttributes::Static);
// 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
);
' 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.
Dim demoMethod As MethodBuilder = _
demoType.DefineMethod("DemoMethod", _
MethodAttributes.Public Or MethodAttributes.Static)
// 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.
//
array<String^>^ genericTypeNames = {"T", "U"};
array<GenericTypeParameterBuilder^>^ genericTypes =
sampleMethodBuilder->DefineGenericParameters(
genericTypeNames);
// 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);
' 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.
'
Dim typeParamNames() As String = {"T", "U"}
Dim typeParameters() As GenericTypeParameterBuilder = _
demoMethod.DefineGenericParameters(typeParamNames)
' The second type parameter is constrained to be a
' reference type.
typeParameters(1).SetGenericParameterAttributes( _
GenericParameterAttributes.ReferenceTypeConstraint)
// Set parameter types for the method. The method takes
// one parameter, and its type is specified by the first
// type parameter, T.
array<Type^>^ parameterTypes = {genericTypes[0]};
sampleMethodBuilder->SetParameters(parameterTypes);
// Set the return type for the method. The return type is
// specified by the second type parameter, U.
sampleMethodBuilder->SetReturnType(genericTypes[1]);
// 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]);
' Set parameter types for the method. The method takes
' one parameter, and its type is specified by the first
' type parameter, T.
Dim params() As Type = {typeParameters(0)}
demoMethod.SetParameters(params)
' Set the return type for the method. The return type is
' specified by the second type parameter, U.
demoMethod.SetReturnType(typeParameters(1))
Комментарии
Используйте эту перегрузку метода, если вы не знаете сигнатуру метода во время определения метода. Например, типы параметров и возвращаемый тип универсального метода могут быть заданы параметрами универсального типа метода, которые должны быть определены после добавления метода к типу. Параметры и тип возвращаемого значения метода можно задать позже с помощью MethodBuilder.SetSignature метода .
Эта перегрузка метода определяет метод с CallingConventions.Standard. Если необходимо определить метод без сигнатуры с другим соглашением о вызовах, используйте перегрузку DefineMethod(String, MethodAttributes, CallingConventions) метода.
См. также раздел
Применяется к
DefineMethod(String, MethodAttributes, Type, Type[])
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода и сигнатурой метода.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, Type? returnType, Type[]? parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod (string name, System.Reflection.MethodAttributes attributes, Type returnType, Type[] parameterTypes);
member this.DefineMethod : string * System.Reflection.MethodAttributes * Type * Type[] -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, returnType As Type, parameterTypes As Type()) As MethodBuilder
Параметры
- name
- String
Имя метода. Параметр name
не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- returnType
- Type
Тип возвращаемых данных метода.
- parameterTypes
- Type[]
Типы параметров метода.
Возвращаемое значение
Определенный метод.
Исключения
Длина параметра name
равна нулю.
-или-
Тип родительского элемента данного метода — интерфейс, и этот метод не является виртуальным (Overridable
в Visual Basic).
name
имеет значение null
.
Этот тип был создан ранее с помощью CreateType().
-или-
Для текущего динамического типа свойство IsGenericType имеет значение true
, но свойство IsGenericTypeDefinition имеет значение false
.
Примеры
В следующем примере кода демонстрируется использование для задания конкретной сигнатуры DefineMethod
и атрибутов конструктора для динамического типа и возврата соответствующего MethodBuilder для заполнения MSIL.
using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
public interface class IMyInterface
{
String^ HelloMethod( String^ parameter );
};
public ref class EmittedClass
{
public:
// Because this method calls Activator::CreateInstance,
// it requires full trust.
[System::Security::Permissions::PermissionSetAttribute
(System::Security::Permissions::SecurityAction::Demand, Name = "FullTrust")]
static void Main()
{
Type^ myNestedClassType = CreateCallee( Thread::GetDomain() );
// Create an instance of 'MyNestedClass'.
IMyInterface^ myInterface = dynamic_cast<IMyInterface^>(Activator::CreateInstance( myNestedClassType ));
Console::WriteLine( myInterface->HelloMethod( "Bill" ) );
}
private:
// Create the callee transient dynamic assembly.
static Type^ CreateCallee( AppDomain^ myAppDomain )
{
AssemblyName^ myAssemblyName = gcnew AssemblyName;
myAssemblyName->Name = "EmittedClass";
// 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'.
array<Type^>^temp0 = {IMyInterface::typeid};
TypeBuilder^ myNestedClassType = myHelloWorldType->DefineNestedType( "MyNestedClass", TypeAttributes::NestedPublic, EmittedClass::typeid, temp0 );
// Implement 'IMyInterface' interface.
myNestedClassType->AddInterfaceImplementation( IMyInterface::typeid );
// Define 'HelloMethod' of 'IMyInterface'.
array<Type^>^temp1 = {String::typeid};
MethodBuilder^ myHelloMethod = myNestedClassType->DefineMethod( "HelloMethod", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Virtual), String::typeid, temp1 );
// Generate IL for 'GetGreeting' method.
ILGenerator^ myMethodIL = myHelloMethod->GetILGenerator();
myMethodIL->Emit( OpCodes::Ldstr, "Hi! " );
myMethodIL->Emit( OpCodes::Ldarg_1 );
array<Type^>^temp2 = {String::typeid,String::typeid};
MethodInfo^ infoMethod = String::typeid->GetMethod( "Concat", temp2 );
myMethodIL->Emit( OpCodes::Call, infoMethod );
myMethodIL->Emit( OpCodes::Ret );
MethodInfo^ myHelloMethodInfo = IMyInterface::typeid->GetMethod( "HelloMethod" );
// Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType->DefineMethodOverride( myHelloMethod, myHelloMethodInfo );
// Create 'MyHelloWorld' type.
Type^ myType = myHelloWorldType->CreateType();
// Create 'MyNestedClass' type.
return myNestedClassType->CreateType();
}
};
int main()
{
EmittedClass::Main();
}
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();
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Security.Permissions
Public Interface IMyInterface
Function HelloMethod(parameter As String) As String
End Interface 'IMyInterface
Public Class Example
<PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
Public Shared Sub Main()
Dim myNestedClassType As Type = CreateCallee(Thread.GetDomain())
' Create an instance of 'MyNestedClass'.
Dim myInterface As IMyInterface = _
CType(Activator.CreateInstance(myNestedClassType), IMyInterface)
Console.WriteLine(myInterface.HelloMethod("Bill"))
End Sub
' Create the callee transient dynamic assembly.
Private Shared Function CreateCallee(myAppDomain As AppDomain) As Type
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "Example"
' Create the callee dynamic assembly.
Dim myAssembly As AssemblyBuilder = _
myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run)
' Create a dynamic module in the callee assembly.
Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
' Define a public class named "MyHelloWorld".
Dim myHelloWorldType As TypeBuilder = _
myModule.DefineType("MyHelloWorld", TypeAttributes.Public)
' Define a public nested class named 'MyNestedClass'.
Dim myNestedClassType As TypeBuilder = _
myHelloWorldType.DefineNestedType("MyNestedClass", TypeAttributes.NestedPublic, _
GetType(Example), New Type() {GetType(IMyInterface)})
' Implement 'IMyInterface' interface.
myNestedClassType.AddInterfaceImplementation(GetType(IMyInterface))
' Define 'HelloMethod' of 'IMyInterface'.
Dim myHelloMethod As MethodBuilder = _
myNestedClassType.DefineMethod("HelloMethod", MethodAttributes.Public Or _
MethodAttributes.Virtual, GetType(String), New Type() {GetType(String)})
' Generate IL for 'GetGreeting' method.
Dim myMethodIL As ILGenerator = myHelloMethod.GetILGenerator()
myMethodIL.Emit(OpCodes.Ldstr, "Hi! ")
myMethodIL.Emit(OpCodes.Ldarg_1)
Dim infoMethod As MethodInfo = _
GetType(String).GetMethod("Concat", New Type() {GetType(String), GetType(String)})
myMethodIL.Emit(OpCodes.Call, infoMethod)
myMethodIL.Emit(OpCodes.Ret)
Dim myHelloMethodInfo As MethodInfo = GetType(IMyInterface).GetMethod("HelloMethod")
' Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo)
' Create 'MyHelloWorld' type.
Dim myType As Type = myHelloWorldType.CreateType()
' Create 'MyNestedClass' type.
Return myNestedClassType.CreateType()
End Function 'CreateCallee
End Class