MethodBase.IsVirtual Vlastnost
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Získá hodnotu určující, zda metoda je virtual.
public:
property bool IsVirtual { bool get(); };
public bool IsVirtual { get; }
member this.IsVirtual : bool
Public ReadOnly Property IsVirtual As Boolean
Hodnota vlastnosti
true pokud je virtualtato metoda ; jinak , false.
Implementuje
Příklady
Následující příklad zobrazí false pro IsFinal, což vás může vést k názoru, že MyMethod je přepsatelný. Kód se vytiskne false , i když MyMethod není označený virtual , a proto ho nelze přepsat.
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
Poznámky
Virtuální člen může odkazovat na data instance ve třídě a musí být odkazován prostřednictvím instance třídy.
Chcete-li zjistit, zda je metoda přepsána, není dostačující zkontrolovat, zda IsVirtual je true. Aby byla metoda přepsána, IsVirtual musí být true a IsFinal musí být false. Například metoda nemusí být virtuální, ale implementuje metodu rozhraní. Modul CLR (Common Language Runtime) vyžaduje, aby všechny metody implementované členy rozhraní byly označeny jako virtual; proto kompilátor označuje metodu virtual final. Proto existují případy, kdy je metoda označena jako virtual , ale stále není přepisovatelná.
Pokud chcete zajistit jistotu, zda je metoda přepsána, použijte například kód:
if (MethodInfo.IsVirtual && !MethodInfo.IsFinal)
If MethodInfo.IsVirtual AndAlso Not MethodInfo.IsFinal Then
Pokud IsVirtual je false nebo IsFinal je true, pak metodu nelze přepsat.
Můžete určit, zda aktuální metoda přepíše metodu v základní třídě voláním MethodInfo.GetBaseDefinition metody. Následující příklad implementuje metodu IsOverride , která to dělá.
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