MethodBase.IsVirtual Proprietà

Definizione

Ottiene un valore che indica se il metodo è virtual.Gets a value indicating whether the method is virtual.

public:
 property bool IsVirtual { bool get(); };
public bool IsVirtual { get; }
member this.IsVirtual : bool
Public ReadOnly Property IsVirtual As Boolean

Valore della proprietà

true se questo metodo è virtual; in caso contrario, false.true if this method is virtual; otherwise, false.

Implementazioni

Esempi

Nell'esempio seguente viene visualizzato false per IsFinal, che può comportare la ritenere che MyMethod sia sottoponibile a override.The following example displays false for IsFinal, which might lead you to think that MyMethod is overridable. Il codice stampa false anche se MyMethod non è contrassegnato virtual e pertanto non è possibile eseguirne l'override.The code prints false even though MyMethod is not marked virtual and thus cannot be overridden.

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

Commenti

Un membro virtuale può fare riferimento ai dati dell'istanza in una classe ed è necessario farvi riferimento tramite un'istanza della classe.A virtual member may reference instance data in a class and must be referenced through an instance of the class.

Per determinare se un metodo è sottoponibile a override, non è sufficiente verificare che IsVirtual sia true.To determine if a method is overridable, it is not sufficient to check that IsVirtual is true. Per poter eseguire l'override di un metodo, è necessario che IsVirtual sia true e che IsFinal false.For a method to be overridable, IsVirtual must be true and IsFinal must be false. Un metodo, ad esempio, potrebbe non essere virtuale, ma implementa un metodo di interfaccia.For example, a method might be non-virtual, but it implements an interface method. Il Common Language Runtime richiede che tutti i metodi che implementano i membri di interfaccia devono essere contrassegnati come virtual; Pertanto, il compilatore contrassegna il metodo virtual final.The common language runtime requires that all methods that implement interface members must be marked as virtual; therefore, the compiler marks the method virtual final. Ci sono quindi casi in cui un metodo è contrassegnato come virtual ma non è ancora sottoponibile a override.So there are cases where a method is marked as virtual but is still not overridable.

Per stabilire con certezza se un metodo può essere sottoponibile a override, usare codice simile al seguente:To establish with certainty whether a method is overridable, use code such as this:

if (MethodInfo.IsVirtual && !MethodInfo.IsFinal)  
If MethodInfo.IsVirtual AndAlso Not MethodInfo.IsFinal Then  

Se IsVirtual è false o IsFinal è true, non è possibile eseguire l'override del metodo.If IsVirtual is false or IsFinal is true, then the method cannot be overridden.

È possibile determinare se il metodo corrente esegue l'override di un metodo in una classe base chiamando il metodo MethodInfo.GetBaseDefinition.You can determine whether the current method overrides a method in a base class by calling the MethodInfo.GetBaseDefinition method. Nell'esempio seguente viene implementato un metodo IsOverride che esegue questa operazione.The following example implements an IsOverride method that does this.

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

Si applica a