MethodBase.IsVirtual Eigenschap
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee wordt een waarde opgehaald die aangeeft of de methode is virtual.
public:
property bool IsVirtual { bool get(); };
public bool IsVirtual { get; }
member this.IsVirtual : bool
Public ReadOnly Property IsVirtual As Boolean
Waarde van eigenschap
true als deze methode is virtual; anders , false.
Implementeringen
Voorbeelden
In het volgende voorbeeld wordt een IsFinalvoorbeeld weergegevenfalse, waardoor u denkt dat dit MyMethod kan worden overschreven. De code wordt afgedrukt false , ook al MyMethod is deze niet gemarkeerd virtual en kan dus niet worden overschreven.
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
Opmerkingen
Een virtueel lid kan verwijzen naar exemplaargegevens in een klasse en moet worden verwezen via een exemplaar van de klasse.
Om te bepalen of een methode kan worden overschreven, is het niet voldoende om dat IsVirtualtruete controleren. Om een methode te kunnen overschrijven, IsVirtual moet dit zijn true en IsFinal moeten zijn false. Een methode kan bijvoorbeeld niet-virtueel zijn, maar implementeert een interfacemethode. De algemene taalruntime vereist dat alle methoden die interfaceleden implementeren, moeten worden gemarkeerd als virtual; daarom markeert de compiler de methode virtual final. Er zijn dus gevallen waarin een methode is gemarkeerd als virtual maar nog steeds niet kan worden overschreven.
Als u zeker wilt weten of een methode kan worden overschreven, gebruikt u code zoals deze:
if (MethodInfo.IsVirtual && !MethodInfo.IsFinal)
If MethodInfo.IsVirtual AndAlso Not MethodInfo.IsFinal Then
Als IsVirtual dat het is false of IsFinal is true, kan de methode niet worden overschreven.
U kunt bepalen of de huidige methode een methode in een basisklasse overschrijft door de methode aan te MethodInfo.GetBaseDefinition roepen. In het volgende voorbeeld wordt een IsOverride methode geïmplementeerd die dit doet.
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