MethodBase.IsVirtual Proprietà
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ottiene un valore che indica se il metodo è 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
.
Implementazioni
Esempio
Nell'esempio seguente viene false
visualizzato per , che potrebbe portare a pensare che sia IsFinal
MyMethod
sottoponibile a override. Il codice viene stampato false
anche se non è MyMethod
contrassegnato e pertanto non può essere virtual
sottoposto a override.
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 e deve essere fatto riferimento tramite un'istanza della classe .
Per determinare se un metodo è sottoponibile a override, non è sufficiente verificare che IsVirtual
sia true
. Perché un metodo sia sottoponibile a override, IsVirtual
deve essere e deve essere true
IsFinal false
. Ad esempio, un metodo potrebbe non essere virtuale, ma implementa un metodo di interfaccia. Common Language Runtime richiede che tutti i metodi che implementano i membri di interfaccia siano contrassegnati come , pertanto il compilatore virtual
contrassegna il metodo virtual final
. Esistono quindi casi in cui un metodo è contrassegnato come virtual
ma non è ancora sottoponibile a override.
Per stabilire con certezza se un metodo è sottoponibile a override, usare codice simile al seguente:
if (MethodInfo.IsVirtual && !MethodInfo.IsFinal)
If MethodInfo.IsVirtual AndAlso Not MethodInfo.IsFinal Then
Se IsVirtual
è o è , non è possibile eseguire false
IsFinal
true
l'override del metodo .
È possibile determinare se il metodo corrente esegue l'override di un metodo in una classe di base chiamando il MethodInfo.GetBaseDefinition metodo . Nell'esempio seguente viene implementato IsOverride
un metodo che esegue questa operazione.
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