TypeBuilder.DefineMethod Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
türüne bir yöntem ekler.
Aşırı Yüklemeler
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][]) |
Türüne belirtilen ad, yöntem öznitelikleri, çağırma kuralı, yöntem imzası ve özel değiştiricilerle yeni bir yöntem ekler. |
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[]) |
Belirtilen ad, yöntem öznitelikleri, çağırma kuralı ve yöntem imzası ile türüne yeni bir yöntem ekler. |
DefineMethod(String, MethodAttributes, CallingConventions) |
Türüne belirtilen ada, yöntem özniteliklerine ve çağırma kuralına sahip yeni bir yöntem ekler. |
DefineMethod(String, MethodAttributes) |
Belirtilen ad ve yöntem öznitelikleriyle türüne yeni bir yöntem ekler. |
DefineMethod(String, MethodAttributes, Type, Type[]) |
Türüne, belirtilen ad, yöntem öznitelikleri ve yöntem imzasıyla yeni bir yöntem ekler. |
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][])
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
Türüne belirtilen ad, yöntem öznitelikleri, çağırma kuralı, yöntem imzası ve özel değiştiricilerle yeni bir yöntem ekler.
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
Parametreler
- name
- String
Yöntemin adı.
name
katıştırılmış null değerleri içeremez.
- attributes
- MethodAttributes
yönteminin öznitelikleri.
- callingConvention
- CallingConventions
yönteminin çağırma kuralı.
- returnType
- Type
yönteminin dönüş türü.
- returnTypeRequiredCustomModifiers
- Type[]
yönteminin dönüş türü için gibi gerekli özel değiştiricileri IsConsttemsil eden bir tür dizisi. Dönüş türünde gerekli özel değiştirici yoksa belirtin null
.
- returnTypeOptionalCustomModifiers
- Type[]
yönteminin dönüş türü için gibi isteğe bağlı özel değiştiricileri IsConsttemsil eden bir tür dizisi. Dönüş türünde isteğe bağlı özel değiştirici yoksa belirtin null
.
- parameterTypes
- Type[]
yönteminin parametrelerinin türleri.
- parameterTypeRequiredCustomModifiers
- Type[][]
Tür dizileri dizisi. Her tür dizisi, gibi IsConstilgili parametre için gerekli özel değiştiricileri temsil eder. Belirli bir parametrenin gerekli özel değiştiricileri yoksa, bir tür dizisi yerine belirtin null
. Parametrelerin hiçbirinin özel değiştiricisi gerekmiyorsa, dizi dizisi yerine belirtin null
.
- parameterTypeOptionalCustomModifiers
- Type[][]
Tür dizileri dizisi. Her tür dizisi, ilgili parametre için isteğe bağlı özel değiştiricileri temsil eder, örneğin IsConst. Belirli bir parametrenin isteğe bağlı özel değiştiricisi yoksa, bir tür dizisi yerine belirtin null
. Parametrelerin hiçbirinin isteğe bağlı özel değiştiricileri yoksa, dizi dizisi yerine belirtin null
.
Döndürülenler
MethodBuilder Yeni eklenen yöntemi temsil eden bir nesne.
Özel durumlar
uzunluğu name
sıfırdır.
-veya-
Bu yöntemin üst öğesinin türü bir arabirimdir ve bu yöntem sanal değildir (Overridable
Visual Basic'te).
-veya-
veya parameterTypeOptionalCustomModifiers
boyutuparameterTypeRequiredCustomModifiers
, boyutuna parameterTypes
eşit değildir.
name
, null
değeridir.
Türü daha önce kullanılarak CreateType()oluşturulmuştur.
-veya-
Geçerli dinamik türü için IsGenericType özelliği şeklindedir true
, ancak IsGenericTypeDefinition özelliği şeklindedir false
.
Açıklamalar
Özel değiştiriciler belirtmeniz gerekiyorsa bu aşırı yüklemeyi kullanın. Yöntem oluşturulduktan sonra özel değiştiriciler belirtmeniz gerekirse, örneğin, parametre türleri genel tür parametreleriyle belirtilen genel bir yöntemle, yöntemi tanımlamak için veya DefineMethod(String, MethodAttributes, CallingConventions) yöntemi aşırı yüklemelerini kullanabilir DefineMethod(String, MethodAttributes) ve ardından yöntemini kullanarak MethodBuilder.SetSignature parametreyi tanımlayabilir ve özel değiştiricilerle türleri döndürebilirsiniz.
Not
Özel değiştiriciler hakkında daha fazla bilgi için bkz. ECMA C# ve Ortak Dil Altyapısı Standartları ve Standart ECMA-335 - Ortak Dil Altyapısı (CLI).
Şunlara uygulanır
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[])
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
Belirtilen ad, yöntem öznitelikleri, çağırma kuralı ve yöntem imzası ile türüne yeni bir yöntem ekler.
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
Parametreler
- name
- String
Yöntemin adı.
name
katıştırılmış null değerleri içeremez.
- attributes
- MethodAttributes
yönteminin öznitelikleri.
- callingConvention
- CallingConventions
yönteminin çağırma kuralı.
- returnType
- Type
yönteminin dönüş türü.
- parameterTypes
- Type[]
yönteminin parametrelerinin türleri.
Döndürülenler
MethodBuilder Yeni tanımlanan yöntemi temsil eden bir.
Özel durumlar
uzunluğu name
sıfırdır.
-veya-
Bu yöntemin üst öğesinin türü bir arabirimdir ve bu yöntem sanal değildir (Overridable
Visual Basic'te).
name
, null
değeridir.
Türü daha önce kullanılarak CreateType()oluşturulmuştur.
-veya-
Geçerli dinamik türü için IsGenericType özelliği şeklindedir true
, ancak IsGenericTypeDefinition özelliği şeklindedir false
.
Örnekler
Aşağıdaki kod örneği, bir oluşturucunun belirli imzasını ve özniteliklerini dinamik bir türe ayarlamak ve MSIL popülasyonu için karşılık gelen MethodBuilder bir döndürmek için uygulamasının kullanımını DefineMethod
gösterir.
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
Şunlara uygulanır
DefineMethod(String, MethodAttributes, CallingConventions)
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
Türüne belirtilen ada, yöntem özniteliklerine ve çağırma kuralına sahip yeni bir yöntem ekler.
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
Parametreler
- name
- String
Yöntemin adı.
name
katıştırılmış null değerleri içeremez.
- attributes
- MethodAttributes
yönteminin öznitelikleri.
- callingConvention
- CallingConventions
yönteminin çağırma kuralı.
Döndürülenler
MethodBuilder Yeni tanımlanan yöntemi temsil eden bir.
Özel durumlar
uzunluğu name
sıfırdır.
-veya-
Bu yöntemin üst öğesinin türü bir arabirimdir ve bu yöntem sanal değildir (Overridable
Visual Basic'te).
name
, null
değeridir.
Türü daha önce kullanılarak CreateType()oluşturulmuştur.
-veya-
Geçerli dinamik türü için IsGenericType özelliği şeklindedir true
, ancak IsGenericTypeDefinition özelliği şeklindedir false
.
Açıklamalar
Yöntemi tanımladığınız sırada yöntem imzasını bilmediğiniz durumlarda bu yöntem aşırı yüklemesini kullanın. Örneğin, bir genel yöntemin parametre türleri ve dönüş türü, yöntemin türüne eklendikten sonra tanımlanması gereken yöntemin genel tür parametreleri tarafından belirtilebilir. Yöntemin parametreleri ve dönüş türü daha sonra yöntemi kullanılarak MethodBuilder.SetSignature ayarlanabilir.
Ayrıca bkz.
Şunlara uygulanır
DefineMethod(String, MethodAttributes)
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
Belirtilen ad ve yöntem öznitelikleriyle türüne yeni bir yöntem ekler.
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
Parametreler
- name
- String
Yöntemin adı.
name
katıştırılmış null değerleri içeremez.
- attributes
- MethodAttributes
yönteminin öznitelikleri.
Döndürülenler
MethodBuilder Yeni tanımlanan yöntemi temsil eden bir.
Özel durumlar
uzunluğu name
sıfırdır.
-veya-
Bu yöntemin üst öğesinin türü bir arabirimdir ve bu yöntem sanal değildir (Overridable
Visual Basic'te).
name
, null
değeridir.
Türü daha önce kullanılarak CreateType()oluşturulmuştur.
-veya-
Geçerli dinamik türü için IsGenericType özelliği şeklindedir true
, ancak IsGenericTypeDefinition özelliği şeklindedir false
.
Örnekler
Aşağıdaki kod örneği, parametre türü ve dönüş türü genel tür parametreleri tarafından belirtilen adlı DemoMethod
genel bir yöntemi tanımlar. yöntemi, standart çağırma kuralı kullanılarak imza olmadan tanımlanır. yöntemi MethodBuilder.DefineGenericParameters genel bir yöntem oluşturmak DemoMethod
için kullanılır ve yeni tanımlanan tür parametreleri daha sonra imza ve dönüş türü için kullanılır.
Bu kod örneği, yöntemi için DefineGenericParameters sağlanan daha büyük bir örneğin parçasıdır.
// 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))
Açıklamalar
Yöntemi tanımladığınız sırada yöntem imzasını bilmediğiniz durumlarda bu yöntem aşırı yüklemesini kullanın. Örneğin, bir genel yöntemin parametre türleri ve dönüş türü, yöntemin türüne eklendikten sonra tanımlanması gereken yöntemin genel tür parametreleri tarafından belirtilebilir. Yöntemin parametreleri ve dönüş türü daha sonra yöntemi kullanılarak MethodBuilder.SetSignature ayarlanabilir.
Bu yöntem aşırı yüklemesi ile CallingConventions.Standardbir yöntemi tanımlar. farklı bir çağırma kuralıyla imzasız bir yöntem tanımlamanız gerekiyorsa yöntem aşırı yüklemesini DefineMethod(String, MethodAttributes, CallingConventions) kullanın.
Ayrıca bkz.
Şunlara uygulanır
DefineMethod(String, MethodAttributes, Type, Type[])
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
- Kaynak:
- TypeBuilder.cs
Belirtilen ad, yöntem öznitelikleri ve yöntem imzası ile türüne yeni bir yöntem ekler.
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
Parametreler
- name
- String
Yöntemin adı.
name
katıştırılmış null içeremez.
- attributes
- MethodAttributes
yönteminin öznitelikleri.
- returnType
- Type
Yönteminin dönüş türü.
- parameterTypes
- Type[]
yönteminin parametrelerinin türleri.
Döndürülenler
Tanımlanan yöntem.
Özel durumlar
uzunluğu name
sıfırdır.
-veya-
Bu yöntemin üst öğesinin türü bir arabirimdir ve bu yöntem sanal değildir (Overridable
Visual Basic'te).
name
, null
değeridir.
Türü daha önce kullanılarak CreateType()oluşturulmuştur.
-veya-
Geçerli dinamik tür IsGenericType için özelliği şeklindedir true
, ancak IsGenericTypeDefinition özelliği şeklindedir false
.
Örnekler
Aşağıdaki kod örneği, bir oluşturucunun özel imzasını ve özniteliklerini dinamik bir türe ayarlamak ve MSIL popülasyonu için karşılık gelen MethodBuilder bir döndürmek için kullanımını DefineMethod
gösterir.
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