MethodBase.IsVirtual Vlastnost

Definice

Získá hodnotu označující, zda je virtualmetoda .

public bool IsVirtual { get; }

Hodnota vlastnosti

truepokud je virtualtato metoda ; v opačném případě . false

Implementuje

Příklady

V následujícím příkladu se zobrazí false hodnota , IsFinalcož může vést k tomu, že si myslíte, že MyMethod je přepsatelná. Kód se vytiskne false , i když MyMethod není označený virtual , a proto ho nelze přepsat.

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

Poznámky

Virtuální člen může odkazovat na data instance ve třídě a musí být odkazován prostřednictvím instance třídy.

Pokud chcete zjistit, jestli je metoda přepisovatelná, nestačí zkontrolovat, jestli IsVirtual je true. Aby byla metoda přepisovatelná, IsVirtual musí být true a IsFinal musí být false. Například metoda může být ne virtuální, ale implementuje metodu rozhraní. Modul CLR (Common Language Runtime) vyžaduje, aby všechny metody, které implementují členy rozhraní, byly označeny jako virtual. Proto kompilátor označí metodu virtual final. Takže existují případy, kdy je metoda označená jako virtual , ale stále není přepisovatelná.

Pokud chcete s jistotou zjistit, jestli je metoda přepisovatelná, použijte kód, jako je tento:

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

Pokud IsVirtual je false nebo IsFinal je true, nelze metodu přepsat.

Voláním metody můžete zjistit, zda aktuální metoda přepíše metodu v základní třídě MethodInfo.GetBaseDefinition . Následující příklad implementuje metodu IsOverride , která to dělá.

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

Platí pro

Produkt Verze
.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