MethodInfo.GetBaseDefinition Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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# atauShadows
kata kunci di Visual Basic (seperti dalamnewslot
, 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
mengambilObject.ToString
alih , danDerived.ToString
mengambil alihBase.ToString
, memanggil GetBaseDefinition metode pada MethodInfo objek yang mewakiliDerived.ToString
mengembalikan MethodInfo objek yang mewakiliObject.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 :
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.
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.
GetBaseDefinition Panggil metode untuk mendapatkan nilai MethodInfo objek yang mewakili definisi metode dasar.