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í nejprve 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, pro který se nachází první definice metody, můžete určit načtením hodnoty DeclaringType vlastnosti na vrácený MethodInfo objekt.
Metoda GetBaseDefinition se chová takto:
Pokud aktuální MethodInfo objekt představuje implementaci rozhraní, GetBaseDefinition metoda vrátí 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 určena s klíčovým slovem
newv jazyce C# neboShadowsklíčové slovo v jazyce Visual Basic (jak jenewslotpopsáno v systému běžných typů), GetBaseDefinition vrátí metoda aktuální MethodInfo objekt.Pokud aktuální MethodInfo objekt představuje zděděnou metodu (tj. aktuální metoda neposkytuje vlastní implementaci), GetBaseDefinition vrátí MethodInfo metoda objekt, který představuje nejnižší metodu v hierarchii tříd. Například pokud přepsání
Object.ToStringaDerived.ToStringpřepsáníBase.ToString, volání GetBaseDefinition metody u MethodInfo objektu, který představujeDerived.ToStringvrátí MethodInfo objekt, který představujeObject.ToString.Base.ToStringPokud aktuální MethodInfo objekt představuje metodu, která není přítomna v žádné základní třídě, GetBaseDefinition vrátí metoda aktuální MethodInfo objekt.
Můžete určit, zda aktuální metoda přepíše metodu v základní třídě voláním GetBaseDefinition metody. Následující příklad implementuje metodu IsOverride , která to dělá.
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
GetBaseDefinition Volání metody:
Type Získejte objekt, který představuje typ (třída nebo struktura), 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, ve které vás zajímá. Můžete to provést získáním pole všech metod z Type.GetMethods metody a následnou iterací prvků 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í metody získat hodnotu MethodInfo objektu, který představuje základní definici metody.