TypeBuilder.DefineMethodOverride(MethodInfo, MethodInfo) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Specifica un determinato corpo del metodo che implementa una determinata dichiarazione di metodo, potenzialmente con un nome diverso.
public:
void DefineMethodOverride(System::Reflection::MethodInfo ^ methodInfoBody, System::Reflection::MethodInfo ^ methodInfoDeclaration);
public void DefineMethodOverride(System.Reflection.MethodInfo methodInfoBody, System.Reflection.MethodInfo methodInfoDeclaration);
member this.DefineMethodOverride : System.Reflection.MethodInfo * System.Reflection.MethodInfo -> unit
Public Sub DefineMethodOverride (methodInfoBody As MethodInfo, methodInfoDeclaration As MethodInfo)
Parametri
- methodInfoBody
- MethodInfo
Corpo del metodo da utilizzare. Deve trattarsi di un MethodBuilder oggetto .
- methodInfoDeclaration
- MethodInfo
Metodo la cui dichiarazione deve essere utilizzata.
Eccezioni
methodInfoBody non appartiene a questa classe.
methodInfoBody o methodInfoDeclaration è null.
Il tipo è stato creato in precedenza usando CreateType().
oppure
Il tipo dichiarante di methodInfoBody non è il tipo rappresentato da questo TypeBuilderoggetto .
Esempio
L'esempio di codice seguente contiene un'interfaccia I con un metodo M(), una classe A base che implementa l'interfaccia e una classe C derivata che esegue l'override dell'implementazione della classe base di M() e fornisce anche un'implementazione esplicita separata di I.M().
Il main() metodo dell'esempio di codice mostra come generare la classe Cderivata . L'override di A.M() viene eseguito semplicemente creando un metodo M() con la stessa firma. Tuttavia, per fornire un'implementazione separata di , è necessario definire un corpo del I.M()metodo e quindi utilizzare il metodo per associare il corpo del DefineMethodOverride metodo a un oggetto MethodInfo che rappresenta I.M(). Il nome del corpo del metodo non è importante.
Nell'esempio di codice viene creata un'istanza della classe emessa. Ottiene un MethodInfo oggetto per I.M()e lo usa per richiamare l'implementazione esplicita dell'interfaccia della classe emessa. Ottiene quindi un MethodInfo oggetto per A.M()e lo usa per richiamare l'override della classe emessa di tale metodo.
using System;
using System.Reflection;
using System.Reflection.Emit;
public interface I
{
void M();
}
public class A
{
public virtual void M() { Console.WriteLine("In method A.M"); }
}
// The object of this code example is to emit code equivalent to
// the following C# code:
//
public class C : A, I
{
public override void M()
{
Console.WriteLine("Overriding A.M from C.M");
}
// In order to provide a different implementation from C.M when
// emitting the following explicit interface implementation,
// it is necessary to use a MethodImpl.
//
void I.M()
{
Console.WriteLine("The I.M implementation of C");
}
}
class Test
{
static void Main()
{
string name = "DefineMethodOverrideExample";
AssemblyName asmName = new AssemblyName(name);
AssemblyBuilder ab =
AssemblyBuilder.DefineDynamicAssembly(
asmName, AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule(name);
TypeBuilder tb =
mb.DefineType("C", TypeAttributes.Public, typeof(A));
tb.AddInterfaceImplementation(typeof(I));
// Build the method body for the explicit interface
// implementation. The name used for the method body
// can be anything. Here, it is the name of the method,
// qualified by the interface name.
//
MethodBuilder mbIM = tb.DefineMethod("I.M",
MethodAttributes.Private | MethodAttributes.HideBySig |
MethodAttributes.NewSlot | MethodAttributes.Virtual |
MethodAttributes.Final,
null,
Type.EmptyTypes);
ILGenerator il = mbIM.GetILGenerator();
il.Emit(OpCodes.Ldstr, "The I.M implementation of C");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
il.Emit(OpCodes.Ret);
// DefineMethodOverride is used to associate the method
// body with the interface method that is being implemented.
//
tb.DefineMethodOverride(mbIM, typeof(I).GetMethod("M"));
MethodBuilder mbM = tb.DefineMethod("M",
MethodAttributes.Public | MethodAttributes.ReuseSlot |
MethodAttributes.Virtual | MethodAttributes.HideBySig,
null,
Type.EmptyTypes);
il = mbM.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Overriding A.M from C.M");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
il.Emit(OpCodes.Ret);
Type tc = tb.CreateType();
object test = Activator.CreateInstance(tc);
MethodInfo mi = typeof(I).GetMethod("M");
mi.Invoke(test, null);
mi = typeof(A).GetMethod("M");
mi.Invoke(test, null);
}
}
/* This code example produces the following output:
The I.M implementation of C
Overriding A.M from C.M
*/
Imports System.Reflection
Imports System.Reflection.Emit
Public Interface I
Sub M()
End Interface
Public Class A
Public Overridable Sub M()
Console.WriteLine("In method A.M")
End Sub
End Class
' The object of this code example is to emit code equivalent to
' the following C# code:
'
Public Class C
Inherits A
Implements I
Public Overrides Sub M()
Console.WriteLine("Overriding A.M from C.M")
End Sub
' In order to provide a different implementation from C.M when
' emitting the following explicit interface implementation,
' it is necessary to use a MethodImpl.
'
Private Sub IM() Implements I.M
Console.WriteLine("The I.M implementation of C")
End Sub
End Class
Class Test
Shared Sub Main()
Dim name As String = "DefineMethodOverrideExample"
Dim asmName As New AssemblyName(name)
Dim ab As AssemblyBuilder = _
AssemblyBuilder.DefineDynamicAssembly( _
asmName, AssemblyBuilderAccess.Run)
Dim mb As ModuleBuilder = _
ab.DefineDynamicModule(name)
Dim tb As TypeBuilder = _
mb.DefineType("C", TypeAttributes.Public, GetType(A))
tb.AddInterfaceImplementation(GetType(I))
' Build the method body for the explicit interface
' implementation. The name used for the method body
' can be anything. Here, it is the name of the method,
' qualified by the interface name.
'
Dim mbIM As MethodBuilder = _
tb.DefineMethod("I.M", _
MethodAttributes.Private Or MethodAttributes.HideBySig Or _
MethodAttributes.NewSlot Or MethodAttributes.Virtual Or _
MethodAttributes.Final, _
Nothing, _
Type.EmptyTypes)
Dim il As ILGenerator = mbIM.GetILGenerator()
il.Emit(OpCodes.Ldstr, "The I.M implementation of C")
il.Emit(OpCodes.Call, GetType(Console).GetMethod("WriteLine", _
New Type() {GetType(String)}))
il.Emit(OpCodes.Ret)
' DefineMethodOverride is used to associate the method
' body with the interface method that is being implemented.
'
tb.DefineMethodOverride(mbIM, GetType(I).GetMethod("M"))
Dim mbM As MethodBuilder = tb.DefineMethod("M", _
MethodAttributes.Public Or MethodAttributes.ReuseSlot Or _
MethodAttributes.Virtual Or MethodAttributes.HideBySig, _
Nothing, _
Type.EmptyTypes)
il = mbM.GetILGenerator()
il.Emit(OpCodes.Ldstr, "Overriding A.M from C.M")
il.Emit(OpCodes.Call, GetType(Console).GetMethod("WriteLine", _
New Type() {GetType(String)}))
il.Emit(OpCodes.Ret)
Dim tc As Type = tb.CreateType()
Dim test As Object = Activator.CreateInstance(tc)
Dim mi As MethodInfo = GetType(I).GetMethod("M")
mi.Invoke(test, Nothing)
mi = GetType(A).GetMethod("M")
mi.Invoke(test, Nothing)
End Sub
End Class
' This code example produces the following output:
'
'The I.M implementation of C
'Overriding A.M from C.M
'
Commenti
Non usare questo metodo per generare override del metodo o implementazioni dell'interfaccia. Per eseguire l'override di un metodo di una classe di base o per implementare un metodo di un'interfaccia, è sufficiente generare un metodo con lo stesso nome e la stessa firma del metodo da sottoporre a override o implementare, come illustrato nell'esempio di codice.
Il DefineMethodOverride metodo viene usato quando un corpo del metodo e una dichiarazione di metodo hanno nomi diversi. Ad esempio, una classe potrebbe eseguire l'override di un metodo di classe base e fornire anche un'implementazione separata per un membro di interfaccia con lo stesso nome, come illustrato nell'esempio di codice.
DefineMethodOverride definisce un methodimploggetto , costituito da una coppia di token di metadati. Un token punta a un'implementazione e l'altro punta a una dichiarazione implementata dal corpo. Il corpo deve essere definito nel tipo in cui è definito il metodo impl e il corpo deve essere virtuale (Overridable in Visual Basic). La dichiarazione può essere effettuata a un metodo definito in un'interfaccia implementata dal tipo, da un metodo in una classe derivata o da un metodo definito nel tipo . Se la dichiarazione si trova solo in un'interfaccia, lo slot definito per l'interfaccia viene modificato. Se la dichiarazione viene effettuata a un metodo su un tipo di base, viene eseguito l'override dello slot per il metodo e vengono sostituiti anche eventuali duplicati per il metodo sottoposto a override. Il metodo sottoposto a override non può essere il metodo effettivo dichiarato. Se il metodo si trova nello stesso tipo, lo slot viene sostituito ed eventuali duplicati per i metodi sostituiti vengono sottoposti a override.
Note
Per altre informazioni sui metodi impls, vedere la documentazione relativa ai metadati ecma partition II in ECMA C# e Common Language Infrastructure Standards e STANDARD ECMA-335 - Common Language Infrastructure (CLI).For more information about method impls, see MethodImpl in the ECMA Partition II Metadata documentation at ECMA C# and Common Language Infrastructure Standards andStandard ECMA-335 - Common Language Infrastructure (CLI).
Importante
Dopo aver chiamato il DefineMethodOverride metodo, non è possibile modificare alcune funzionalità di methodInfoBody . Ad esempio, non è possibile applicare un attributo a un parametro di tipo generico di methodInfoBody utilizzando il SetGenericParameterAttributes metodo . Se è necessario utilizzare il DefineMethodOverride metodo , eseguire questa operazione dopo aver definito tutte le caratteristiche di methodInfoBody .