MethodBase.IsVirtual Properti
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.
Mendapatkan nilai yang menunjukkan apakah metodenya adalah virtual
.
public:
property bool IsVirtual { bool get(); };
public bool IsVirtual { get; }
member this.IsVirtual : bool
Public ReadOnly Property IsVirtual As Boolean
Nilai Properti
true
jika metode ini adalah virtual
; jika tidak, false
.
Penerapan
Contoh
Contoh berikut menampilkan false
untuk IsFinal
, yang mungkin menyebabkan Anda berpikir bahwa MyMethod
dapat diganti. Kode mencetak false
meskipun MyMethod
tidak ditandai virtual
dan dengan demikian tidak dapat ditimpa.
using namespace System;
using namespace System::Reflection;
public ref class MyClass
{
public:
void MyMethod(){}
};
int main()
{
MethodBase^ m = MyClass::typeid->GetMethod( "MyMethod" );
Console::WriteLine( "The IsFinal property value of MyMethod is {0}.", m->IsFinal );
Console::WriteLine( "The IsVirtual property value of MyMethod is {0}.", m->IsVirtual );
}
using System;
using System.Reflection;
public class MyClass
{
public void MyMethod()
{
}
public static void Main()
{
MethodBase m = typeof(MyClass).GetMethod("MyMethod");
Console.WriteLine("The IsFinal property value of MyMethod is {0}.", m.IsFinal);
Console.WriteLine("The IsVirtual property value of MyMethod is {0}.", m.IsVirtual);
}
}
Imports System.Reflection
Public Class MyClass1
Public Sub MyMethod()
End Sub
Public Shared Sub Main()
Dim m As MethodBase = GetType(MyClass1).GetMethod("MyMethod")
Console.WriteLine("The IsFinal property value of MyMethod is {0}.", m.IsFinal)
Console.WriteLine("The IsVirtual property value of MyMethod is {0}.", m.IsVirtual)
End Sub
End Class
Keterangan
Anggota virtual dapat mereferensikan data instans di kelas dan harus dirujuk melalui instans kelas .
Untuk menentukan apakah metode dapat diganti, tidak cukup untuk memeriksa apakah IsVirtual
itu true
. Agar metode dapat diganti, IsVirtual
harus true
dan IsFinal harus false
. Misalnya, metode mungkin non-virtual, tetapi menerapkan metode antarmuka. Runtime bahasa umum mengharuskan semua metode yang mengimplementasikan anggota antarmuka harus ditandai sebagai virtual
; oleh karena itu, kompilator menandai metode virtual final
. Jadi ada kasus di mana metode ditandai sebagai virtual
tetapi masih belum dapat diambil alih.
Untuk menetapkan dengan pasti apakah metode dapat diganti, gunakan kode seperti ini:
if (MethodInfo.IsVirtual && !MethodInfo.IsFinal)
If MethodInfo.IsVirtual AndAlso Not MethodInfo.IsFinal Then
Jika IsVirtual
adalah false
atau IsFinal
adalah true
, maka metode tidak dapat ditimpa.
Anda dapat menentukan apakah metode saat ini mengambil alih metode di kelas dasar dengan memanggil MethodInfo.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