MethodInfo.GetBaseDefinition Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Wanneer deze wordt overschreven in een afgeleide klasse, retourneert u het MethodInfo object voor de methode op de directe of indirecte basisklasse waarin de methode die wordt vertegenwoordigd door dit exemplaar voor het eerst is gedeclareerd.
public:
abstract System::Reflection::MethodInfo ^ GetBaseDefinition();
public abstract System.Reflection.MethodInfo GetBaseDefinition();
abstract member GetBaseDefinition : unit -> System.Reflection.MethodInfo
Public MustOverride Function GetBaseDefinition () As MethodInfo
Retouren
Een MethodInfo object voor de eerste implementatie van deze methode.
Implementeringen
Voorbeelden
In het volgende voorbeeld ziet u het gedrag van de GetBaseDefinition methode.
using System;
using System.Reflection;
interface Interf
{
string InterfaceImpl(int n);
}
public class BaseClass
{
public override string ToString()
{
return "Base";
}
public virtual void Method1()
{
Console.WriteLine("Method1");
}
public virtual void Method2()
{
Console.WriteLine("Method2");
}
public virtual void Method3()
{
Console.WriteLine("Method3");
}
}
public class DerivedClass : BaseClass, Interf
{
public string InterfaceImpl(int n)
{
return n.ToString("N");
}
public override void Method2()
{
Console.WriteLine("Derived.Method2");
}
public new void Method3()
{
Console.WriteLine("Derived.Method3");
}
}
public class Example
{
public static void Main()
{
Type t = typeof(DerivedClass);
MethodInfo m, mb;
string[] methodNames = { "ToString", "Equals", "InterfaceImpl",
"Method1", "Method2", "Method3" };
foreach (var methodName in methodNames) {
m = t.GetMethod(methodName);
mb = m.GetBaseDefinition();
Console.WriteLine("{0}.{1} --> {2}.{3}", m.ReflectedType.Name,
m.Name, mb.ReflectedType.Name, mb.Name);
}
}
}
// The example displays the following output:
// DerivedClass.ToString --> Object.ToString
// DerivedClass.Equals --> Object.Equals
// DerivedClass.InterfaceImpl --> DerivedClass.InterfaceImpl
// DerivedClass.Method1 --> BaseClass.Method1
// DerivedClass.Method2 --> BaseClass.Method2
// DerivedClass.Method3 --> DerivedClass.Method3
Imports System.Reflection
Interface Interf
Function InterfaceImpl(n As Integer) As String
End Interface
Public Class BaseClass
Public Overrides Function ToString() As String
Return "Base"
End Function
Public Overridable Sub Method1()
Console.WriteLine("Method1")
End Sub
Public Overridable Sub Method2()
Console.WriteLine("Method2")
End Sub
Public Overridable Sub Method3()
Console.WriteLine("Method3")
End Sub
End Class
Public Class DerivedClass : Inherits BaseClass : Implements Interf
Public Function InterfaceImpl(n As Integer) As String _
Implements Interf.InterfaceImpl
Return n.ToString("N")
End Function
Public Overrides Sub Method2()
Console.WriteLine("Derived.Method2")
End Sub
Public Shadows Sub Method3()
Console.WriteLine("Derived.Method3")
End Sub
End Class
Module Example
Public Sub Main()
Dim t As Type = GetType(DerivedClass)
Dim m, mb As MethodInfo
Dim methodNames() As String = { "ToString", "Equals",
"InterfaceImpl", "Method1",
"Method2", "Method3" }
For Each methodName In methodNames
m = t.GetMethod(methodName)
mb = m.GetBaseDefinition()
Console.WriteLine("{0}.{1} --> {2}.{3}", m.ReflectedType.Name,
m.Name, mb.ReflectedType.Name, mb.Name)
Next
End Sub
End Module
' The example displays the following output:
' DerivedClass.ToString --> Object.ToString
' DerivedClass.Equals --> Object.Equals
' DerivedClass.InterfaceImpl --> DerivedClass.InterfaceImpl
' DerivedClass.Method1 --> BaseClass.Method1
' DerivedClass.Method2 --> BaseClass.Method2
' DerivedClass.Method3 --> DerivedClass.Method3
Opmerkingen
De GetBaseDefinition methode retourneert de eerste definitie van de opgegeven methode in de klassehiërarchie. U kunt het type bepalen waarop de eerste definitie van de methode wordt gevonden door de waarde van de DeclaringType eigenschap op te halen voor het geretourneerde MethodInfo object.
De GetBaseDefinition methode gedraagt zich als volgt:
Als het huidige MethodInfo object een interface-implementatie vertegenwoordigt, retourneert de GetBaseDefinition methode het huidige MethodInfo object.
Als het huidige MethodInfo object een methode vertegenwoordigt die een virtuele definitie in een basisklasse overschrijft, retourneert de GetBaseDefinition methode een MethodInfo object dat de virtuele definitie vertegenwoordigt.
Als het huidige MethodInfo-object een methode vertegenwoordigt die is opgegeven met het trefwoord
newin C# of het trefwoordShadowsin Visual Basic (zoals innewslot, zoals beschreven in Common Type System), retourneert de methode GetBaseDefinition het huidige MethodInfo-object.Als het huidige MethodInfo object een overgenomen methode vertegenwoordigt (dat wil zeggen dat de huidige methode geen eigen implementatie biedt), retourneert de GetBaseDefinition methode een MethodInfo object dat de laagste methode in de klassehiërarchie vertegenwoordigt. Als
Base.ToStringbijvoorbeeld onderdrukkingen enDerived.ToStringonderdrukkingenObject.ToStringBase.ToStringworden aangeroepen, wordt de GetBaseDefinition methode aangeroepen voor een MethodInfo object dat een MethodInfo object vertegenwoordigt dat een object vertegenwoordigtDerived.ToStringObject.ToString.Als het huidige MethodInfo object een methode vertegenwoordigt die niet aanwezig is in een basisklasse, retourneert de GetBaseDefinition methode het huidige MethodInfo object.
U kunt bepalen of de huidige methode een methode in een basisklasse overschrijft door de methode aan te GetBaseDefinition roepen. In het volgende voorbeeld wordt een IsOverride methode geïmplementeerd die dit doet.
using System;
using System.Reflection;
public class ReflectionUtilities
{
public static bool IsOverride(MethodInfo method)
{
return ! method.Equals(method.GetBaseDefinition());
}
}
public class Example
{
public static void Main()
{
MethodInfo equals = typeof(Int32).GetMethod("Equals",
new Type[] { typeof(Object) } );
Console.WriteLine("{0}.{1} is inherited: {2}",
equals.ReflectedType.Name, equals.Name,
ReflectionUtilities.IsOverride(equals));
equals = typeof(Object).GetMethod("Equals",
new Type[] { typeof(Object) } );
Console.WriteLine("{0}.{1} is inherited: {2}",
equals.ReflectedType.Name, equals.Name,
ReflectionUtilities.IsOverride(equals));
}
}
// The example displays the following output:
// Int32.Equals is inherited: True
// Object.Equals is inherited: False
Imports System.Reflection
Public Class ReflectionUtilities
Public Shared Function IsOverride(method As MethodInfo) As Boolean
Return Not method.Equals(method.GetBaseDefinition())
End Function
End Class
Module Example
Public Sub Main()
Dim equals As MethodInfo = GetType(Int32).GetMethod("Equals",
{ GetType(Object) } )
Console.WriteLine("{0}.{1} is inherited: {2}",
equals.ReflectedType.Name, equals.Name,
ReflectionUtilities.IsOverride(equals))
equals = GetType(Object).GetMethod("Equals", { GetType(Object) } )
Console.WriteLine("{0}.{1} is inherited: {2}",
equals.ReflectedType.Name, equals.Name,
ReflectionUtilities.IsOverride(equals))
End Sub
End Module
' The example displays the following output:
' Int32.Equals is inherited: True
' Object.Equals is inherited: False
De methode aanroepen GetBaseDefinition :
Haal een Type object op dat het type (de klasse of structuur) vertegenwoordigt dat de eigenschap bevat. Als u met een object werkt (een exemplaar van een type), kunt u de GetType methode aanroepen. Anders kunt u de C#-operator of de operator Visual Basic GetType gebruiken, zoals in het voorbeeld wordt geïllustreerd.
Haal een MethodInfo object op dat de methode vertegenwoordigt waarin u geïnteresseerd bent. U kunt dit doen door een matrix van alle methoden op te halen uit de Type.GetMethods methode en vervolgens de elementen in de matrix te herhalen, of u kunt het MethodInfo object ophalen dat de methode rechtstreeks vertegenwoordigt door de methode aan Type.GetMethod(String) te roepen en de naam van de methode op te geven.
Roep de GetBaseDefinition methode aan om de waarde op te halen van het MethodInfo object dat de definitie van de basismethode vertegenwoordigt.