MethodBase.IsVirtual Eigenschap

Definitie

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

Van toepassing op