Sdílet prostřednictvím


MethodInfo.GetBaseDefinition Metoda

Definice

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# nebo Shadows klíčového slova v jazyce Visual Basic (jako v newslot, 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íše Object.ToStringa Derived.ToString , Base.ToStringvolání GetBaseDefinition metody u objektu MethodInfo , který představuje Derived.ToString , vrátí MethodInfo objekt , který představuje Object.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 :

  1. 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.

  2. 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.

  3. GetBaseDefinition Voláním metody získáte hodnotu objektuMethodInfo, který představuje definici základní metody.

Platí pro

Viz také