Freigeben über


MethodInfo.GetBaseDefinition Methode

Definition

Gibt beim Überschreiben in einer abgeleiteten Klasse das MethodInfo-Objekt für die Methode in der direkten oder indirekten Basisklasse zurück, in der die durch diese Instanz dargestellte Methode zuerst deklariert wurde.

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

Gibt zurück

Ein MethodInfo-Objekt für die erste Implementierung dieser Methode.

Implementiert

Beispiele

Im folgenden Beispiel wird das Verhalten der GetBaseDefinition -Methode veranschaulicht.

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

Hinweise

Die GetBaseDefinition -Methode gibt die erste Definition der angegebenen Methode in der Klassenhierarchie zurück. Sie können den Typ bestimmen, für den die erste Definition der Methode gefunden wird, indem Sie den Wert der -Eigenschaft für das DeclaringType zurückgegebene MethodInfo Objekt abrufen.

Die GetBaseDefinition Methode verhält sich wie folgt:

  • Wenn das aktuelle MethodInfo Objekt eine Schnittstellenimplementierung darstellt, gibt die GetBaseDefinition Methode das aktuelle MethodInfo Objekt zurück.

  • Wenn das aktuelle MethodInfo Objekt eine Methode darstellt, die eine virtuelle Definition in einer Basisklasse außer Kraft setzt, gibt die GetBaseDefinition Methode ein MethodInfo Objekt zurück, das die virtuelle Definition darstellt.

  • Wenn das aktuelle MethodInfo Objekt eine Methode darstellt, die mit dem new Schlüsselwort (keyword) in C# oder dem Shadows Schlüsselwort (keyword) in Visual Basic angegeben wird (wie in , wie in newslotCommon Type System beschrieben), gibt die GetBaseDefinition -Methode das aktuelle MethodInfo Objekt zurück.

  • Wenn das aktuelle MethodInfo Objekt eine geerbte Methode darstellt (d. h. die aktuelle Methode stellt keine eigene Implementierung bereit), gibt die GetBaseDefinition -Methode ein MethodInfo -Objekt zurück, das die niedrigste Methode in der Klassenhierarchie darstellt. Wenn beispielsweise überschrieben Object.ToStringwird, und Derived.ToString überschrieben Base.ToStringwird, gibt das Aufrufen der GetBaseDefinition -Methode für ein MethodInfo -Objekt, das darstelltDerived.ToString, ein MethodInfo -Objekt zurück, das darstelltObject.ToString.Base.ToString

  • Wenn das aktuelle MethodInfo Objekt eine Methode darstellt, die in keiner Basisklasse vorhanden ist, gibt die GetBaseDefinition Methode das aktuelle MethodInfo Objekt zurück.

Sie können bestimmen, ob die aktuelle Methode eine Methode in einer Basisklasse außer Kraft setzt, indem Sie die GetBaseDefinition -Methode aufrufen. Im folgenden Beispiel wird eine IsOverride Methode implementiert, die dies tut.

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

So rufen Sie die Methode auf GetBaseDefinition :

  1. Rufen Sie ein Type -Objekt ab, das den Typ (die Klasse oder Struktur) darstellt, der die -Eigenschaft enthält. Wenn Sie mit einem Objekt (einem instance eines Typs) arbeiten, können Sie dessen GetType Methode aufrufen. Andernfalls können Sie den C#-Operator oder den Visual Basic GetType-Operator verwenden, wie das Beispiel veranschaulicht.

  2. Rufen Sie ein MethodInfo -Objekt ab, das die Methode darstellt, an der Sie interessiert sind. Hierzu können Sie ein Array aller Methoden aus der Type.GetMethods -Methode abrufen und dann die Elemente im Array durchlaufen, oder Sie können das Objekt abrufen, das MethodInfo die Methode direkt darstellt, indem Sie die Type.GetMethod(String) -Methode aufrufen und den Methodennamen angeben.

  3. Rufen Sie die GetBaseDefinition -Methode auf, um den Wert des MethodInfo Objekts abzurufen, das die Basismethodendefinition darstellt.

Gilt für:

Weitere Informationen