MethodBase.IsVirtual Propiedad

Definición

Obtiene un valor que indica si el método es virtual.

C#
public bool IsVirtual { get; }

Valor de propiedad

true si este método es virtual; en caso contrario, false.

Implementaciones

Ejemplos

En el ejemplo siguiente se muestra false para IsFinal, lo que puede llevar a pensar que MyMethod es reemplazable. El código se imprime false aunque MyMethod no está marcado virtual y, por tanto, no se puede invalidar.

C#
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);
    }
}

Comentarios

Un miembro virtual puede hacer referencia a los datos de instancia de una clase y se debe hacer referencia a ellos a través de una instancia de la clase .

Para determinar si un método se puede invalidar, no es suficiente comprobar que IsVirtual es true. Para que un método se pueda invalidar, IsVirtual debe ser true y IsFinal debe ser false. Por ejemplo, un método podría no ser virtual, pero implementa un método de interfaz. Common Language Runtime requiere que todos los métodos que implementan miembros de interfaz se marquen como virtual; por lo tanto, el compilador marca el método virtual final. Por lo tanto, hay casos en los que un método está marcado como virtual pero todavía no se puede invalidar.

Para establecer con certeza si un método se puede invalidar, use código como este:

C#
if (MethodInfo.IsVirtual && !MethodInfo.IsFinal)

Si IsVirtual es o IsFinal es truefalse , el método no se puede invalidar.

Puede determinar si el método actual invalida un método en una clase base llamando al MethodInfo.GetBaseDefinition método . En el ejemplo siguiente se implementa un IsOverride método que lo hace.

C#
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

Se aplica a

Produto Versións
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0