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 riportato di false seguito IsFinalviene visualizzato per, che potrebbe MyMethod comportare l'override di.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 può essere sottoposto a 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 IsVirtual controllarlo true.To determine if a method is overridable, it is not sufficient to check that IsVirtual is true. Per eseguire l'override di un metodo, IsVirtual deve essere true e IsFinal deve essere 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 virtualdevono essere contrassegnati come; pertanto, il virtual finalcompilatore contrassegna il metodo.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 virtual come, 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 è ,nonèpossibileeseguirel'overridedelmetodo.trueIf 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 MethodInfo.GetBaseDefinition chiamando il metodo.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 IsOverride un metodo 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