Поделиться через


MethodInfo.GetBaseDefinition Метод

Определение

Если переопределено в производном классе, возвращает объект MethodInfo для метода в прямом или косвенном базовом классе, в котором был первоначально объявлен метод, предоставляемый этим экземпляром.

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

Возвращаемое значение

Объект MethodInfo для первой реализации этого метода.

Реализации

Примеры

В следующем примере демонстрируется поведение GetBaseDefinition метода .

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

Комментарии

Метод GetBaseDefinition возвращает первое определение указанного метода в иерархии классов. Вы можете определить тип, для которого найдено первое определение метода, извлекая значение DeclaringType свойства в возвращаемом объекте MethodInfo .

Метод GetBaseDefinition ведет себя следующим образом:

  • Если текущий MethodInfo объект представляет реализацию интерфейса, GetBaseDefinition метод возвращает текущий MethodInfo объект .

  • Если текущий MethodInfo объект представляет метод, переопределяющий виртуальное определение в базовом классе, GetBaseDefinition метод возвращает MethodInfo объект, представляющий виртуальное определение.

  • Если текущий MethodInfo объект представляет метод, указанный с new помощью ключевое слово в C# или Shadows ключевое слово в Visual Basic (как описано в newslotразделе Common Type System), GetBaseDefinition метод возвращает текущий MethodInfo объект.

  • Если текущий MethodInfo объект представляет наследуемый метод (то есть текущий метод не предоставляет собственной реализации), GetBaseDefinition метод возвращает MethodInfo объект , представляющий самый низкий метод в иерархии классов. Например, если переопределяет Object.ToString, и Derived.ToString переопределяет Base.ToString, вызов GetBaseDefinition метода для объекта, представляющего MethodInfoDerived.ToString , возвращает MethodInfo объект , представляющий Object.ToString.Base.ToString

  • Если текущий MethodInfo объект представляет метод, который отсутствует ни в одном базовом GetBaseDefinition классе, метод возвращает текущий MethodInfo объект .

Вы можете определить, переопределяет ли текущий метод метод в базовом классе, вызвав GetBaseDefinition метод . В следующем примере реализуется IsOverride метод, который делает это.

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 действия:

  1. Type Возвращает объект , представляющий тип (класс или структуру), содержащий свойство . При работе с объектом (экземпляром типа) можно вызвать его GetType метод . В противном случае можно использовать оператор C# или оператор GetType Visual Basic, как показано в примере.

  2. MethodInfo Получите объект , представляющий интересующий вас метод. Это можно сделать, получив массив всех методов из Type.GetMethods метода , а затем выполнив итерацию по элементам в массиве, или получить MethodInfo объект, представляющий метод напрямую, вызвав Type.GetMethod(String) метод и указав имя метода.

  3. Вызовите метод , GetBaseDefinition чтобы получить значение MethodInfo объекта, представляющего определение базового метода.

Применяется к

См. также раздел