MethodInfo.GetBaseDefinition Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Při přepsání v odvozené třídě vrátí MethodInfo objekt pro metodu na přímé nebo nepřímé základní třídě, ve které byla metoda reprezentovaná touto instancí poprvé deklarována.
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
Návraty
Objekt MethodInfo pro první implementaci této metody.
Implementuje
Příklady
Následující příklad ukazuje chování GetBaseDefinition metody .
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
Poznámky
Metoda GetBaseDefinition vrátí první definici zadané metody v hierarchii tříd. Typ, na kterém je nalezena první definice metody, můžete určit načtením hodnoty DeclaringType vlastnosti vráceného MethodInfo objektu.
Metoda se GetBaseDefinition chová takto:
Pokud aktuální MethodInfo objekt představuje implementaci GetBaseDefinition rozhraní, vrátí metoda aktuální MethodInfo objekt.
Pokud aktuální MethodInfo objekt představuje metodu, která přepíše virtuální definici v základní třídě, GetBaseDefinition vrátí MethodInfo metoda objekt, který představuje virtuální definici.
Pokud aktuální MethodInfo objekt představuje metodu, která je zadána pomocí klíčového
new
slova v jazyce C# neboShadows
klíčového slova v jazyce Visual Basic (jako vnewslot
, jak je popsáno v common type system), GetBaseDefinition vrátí metoda aktuální MethodInfo objekt.Pokud aktuální MethodInfo objekt představuje zděděnou metodu (to znamená, že aktuální metoda neposkytuje vlastní implementaci), GetBaseDefinition vrátí MethodInfo metoda objekt, který představuje nejnižší metodu v hierarchii tříd. Pokud například
Base.ToString
přepíšeObject.ToString
aDerived.ToString
,Base.ToString
volání GetBaseDefinition metody u objektu MethodInfo , který představujeDerived.ToString
, vrátí MethodInfo objekt , který představujeObject.ToString
.Pokud aktuální MethodInfo objekt představuje metodu, která neexistuje v žádné základní třídě, GetBaseDefinition vrátí metoda aktuální MethodInfo objekt.
Voláním GetBaseDefinition metody můžete zjistit, zda aktuální metoda přepisuje metodu v základní třídě. Následující příklad implementuje metodu IsOverride
, která to provede.
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
Volání GetBaseDefinition
metody :
Type Získejte objekt, který představuje typ (třídu nebo strukturu), který obsahuje vlastnost . Pokud pracujete s objektem (instancí typu), můžete volat jeho GetType metodu. V opačném případě můžete použít operátor jazyka C# nebo operátor GetType jazyka Visual Basic, jak je znázorněno v příkladu.
MethodInfo Získejte objekt, který představuje metodu, která vás zajímá. Můžete to provést tak, že z Type.GetMethods metody získáte pole všech metod a pak iterujete prvky v poli, nebo můžete načíst MethodInfo objekt, který představuje metodu přímo voláním Type.GetMethod(String) metody a zadáním názvu metody.
GetBaseDefinition Voláním metody získáte hodnotu objektuMethodInfo, který představuje definici základní metody.