Bagikan melalui


MethodInfo.GetBaseDefinition Metode

Definisi

Ketika ditimpa dalam kelas turunan, mengembalikan MethodInfo objek untuk metode pada kelas dasar langsung atau tidak langsung di mana metode yang diwakili oleh instans ini pertama kali dideklarasikan.

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

Mengembalikan

Objek MethodInfo untuk implementasi pertama metode ini.

Penerapan

Contoh

Contoh berikut menunjukkan perilaku GetBaseDefinition metode .

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

Keterangan

Metode mengembalikan GetBaseDefinition definisi pertama dari metode yang ditentukan dalam hierarki kelas. Anda dapat menentukan jenis di mana definisi pertama metode ditemukan dengan mengambil nilai DeclaringType properti pada objek yang dikembalikan MethodInfo .

Metode ini GetBaseDefinition berulah sebagai berikut:

  • Jika objek saat ini MethodInfo mewakili implementasi antarmuka, GetBaseDefinition metode mengembalikan objek saat ini MethodInfo .

  • Jika objek saat ini MethodInfo mewakili metode yang mengambil alih definisi virtual di kelas dasar, GetBaseDefinition metode mengembalikan MethodInfo objek yang mewakili definisi virtual.

  • Jika objek saat ini MethodInfo mewakili metode yang ditentukan dengan new kata kunci di C# atau Shadows kata kunci di Visual Basic (seperti dalam newslot, seperti yang dijelaskan dalam Common Type System), GetBaseDefinition metode mengembalikan objek saat ini MethodInfo .

  • Jika objek saat ini MethodInfo mewakili metode yang diwariskan (yaitu, metode saat ini tidak menyediakan implementasinya sendiri), GetBaseDefinition metode mengembalikan MethodInfo objek yang mewakili metode terendah dalam hierarki kelas. Misalnya, jika Base.ToString mengambil Object.ToStringalih , dan Derived.ToString mengambil alih Base.ToString, memanggil GetBaseDefinition metode pada MethodInfo objek yang mewakili Derived.ToString mengembalikan MethodInfo objek yang mewakili Object.ToString.

  • Jika objek saat ini MethodInfo mewakili metode yang tidak ada di kelas dasar apa pun, GetBaseDefinition metode mengembalikan objek saat ini MethodInfo .

Anda dapat menentukan apakah metode saat ini mengambil alih metode di kelas dasar dengan memanggil GetBaseDefinition metode . Contoh berikut mengimplementasikan IsOverride metode yang melakukan ini.

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

Untuk memanggil GetBaseDefinition metode :

  1. Type Dapatkan objek yang mewakili jenis (kelas atau struktur) yang berisi properti . Jika Anda bekerja dengan objek (instans jenis), Anda dapat memanggil metodenya GetType . Jika tidak, Anda dapat menggunakan operator C# atau operator Visual Basic GetType , seperti yang diilustrasikan contohnya.

  2. MethodInfo Dapatkan objek yang mewakili metode yang Anda minati. Anda dapat melakukan ini dengan mendapatkan array semua metode dari Type.GetMethods metode dan kemudian melakukan iterasi elemen dalam array, atau Anda dapat mengambil MethodInfo objek yang mewakili metode secara langsung dengan memanggil Type.GetMethod(String) metode dan menentukan nama metode.

  3. GetBaseDefinition Panggil metode untuk mendapatkan nilai MethodInfo objek yang mewakili definisi metode dasar.

Berlaku untuk

Lihat juga