MethodInfo.GetBaseDefinition Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Ha egy származtatott osztályban felül van bírálva, a MethodInfo metódus objektumát adja vissza azon a közvetlen vagy közvetett alaposztályon, amelyben a példány által képviselt metódus először deklarálva lett.
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
Válaszok
A MethodInfo metódus első implementációjának objektuma.
Megvalósítás
Példák
Az alábbi példa a metódus viselkedését GetBaseDefinition mutatja be.
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
Megjegyzések
A GetBaseDefinition metódus a megadott metódus első definícióját adja vissza az osztályhierarchiában. A metódus első definíciójának típusát a visszaadott DeclaringType objektum tulajdonságának értékének MethodInfo beolvasásával határozhatja meg.
A GetBaseDefinition metódus a következőképpen viselkedik:
Ha az aktuális MethodInfo objektum egy felületi implementációt jelöl, a GetBaseDefinition metódus az aktuális MethodInfo objektumot adja vissza.
Ha az aktuális MethodInfo objektum egy olyan metódust jelöl, amely felülbírál egy virtuális definíciót egy alaposztályban, a GetBaseDefinition metódus egy MethodInfo olyan objektumot ad vissza, amely a virtuális definíciót jelöli.
Ha az aktuális MethodInfo objektum a C#
newkulcsszójával vagy aShadowskulcsszóval megadott metódust jelöli a Visual Basic (newslot, a Common típusú rendszer) szerint a GetBaseDefinition metódus az aktuális MethodInfo objektumot adja vissza.Ha az aktuális MethodInfo objektum öröklött metódust jelöl (vagyis az aktuális metódus nem biztosítja a saját implementációját), a GetBaseDefinition metódus egy MethodInfo olyan objektumot ad vissza, amely az osztályhierarchiában a legalacsonyabb metódust képviseli. Ha például felülbírálások
Base.ToStringésObject.ToStringfelülbírálásokDerived.ToString, aBase.ToStringmetódus meghívása egy GetBaseDefinition olyan objektumon történik, amely egy MethodInfo olyan objektumot ad visszaDerived.ToString, amely a függvényt jelöliMethodInfo.Object.ToStringHa az aktuális MethodInfo objektum olyan metódust jelöl, amely egyik alaposztályban sem szerepel, a GetBaseDefinition metódus az aktuális MethodInfo objektumot adja vissza.
A metódus meghívásával meghatározhatja, hogy az aktuális metódus felülbírál-e egy metódust egy GetBaseDefinition alaposztályban. Az alábbi példa egy IsOverride metódust implementál, amely ezt teszi.
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
A metódus meghívása GetBaseDefinition :
Type Szerezze be a tulajdonságot tartalmazó típust (osztályt vagy struktúrát) képviselő objektumot. Ha objektummal (egy típuspéldánysal) dolgozik, meghívhatja annak metódusát GetType . Ellenkező esetben használhatja a C# operátort vagy a Visual Basic GetType operátort, amint azt a példa szemlélteti.
MethodInfo Szerezze be azt az objektumot, amely az önt érdeklő metódust jelöli. Ehhez lekérheti a Type.GetMethods metódus összes metódusát tartalmazó tömböt, majd iterálja a tömb elemeit, vagy közvetlenül a metódus meghívásával MethodInfo és a metódus nevének megadásával lekérheti Type.GetMethod(String) a metódust jelképező objektumot.
Hívja meg a metódust GetBaseDefinition az alapmetódus definícióját képviselő objektum értékének MethodInfo lekéréséhez.