Прочитать на английском

Поделиться через


MethodBase.IsVirtual Свойство

Определение

Получает значение, указывающее, имеет ли метод значение virtual.

public bool IsVirtual { get; }

Значение свойства

true, если этот метод имеет значение virtual. В противном случае — false.

Реализации

Примеры

В следующем примере отображается false для IsFinal, что может привести к мысли, что MyMethod является переопределенным. Код печатается, false даже если MyMethod не помечен virtual и поэтому не может быть переопределен.

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

Комментарии

Виртуальный член может ссылаться на данные экземпляра в классе и должен ссылаться через экземпляр класса .

Чтобы определить, является ли метод переопределенным, недостаточно проверка, что IsVirtual равно true. Чтобы метод был переопределен, IsVirtual должен иметь значение true , а IsFinal должно иметь значение false. Например, метод может быть не виртуальным, но он реализует метод интерфейса. Среда CLR требует, чтобы все методы, реализующие члены интерфейса, были помечены как virtual; поэтому компилятор помечает метод virtual final. Поэтому бывают случаи, когда метод помечается как virtual , но по-прежнему не переопределяется.

Чтобы с уверенностью определить, является ли метод переопределенным, используйте следующий код:

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

Если IsVirtual имеет значение false или IsFinal имеет trueзначение , метод нельзя переопределить.

Вы можете определить, переопределяет ли текущий метод метод в базовом классе, вызвав MethodInfo.GetBaseDefinition метод . В следующем примере реализуется IsOverride метод, который делает это.

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

Применяется к

Продукт Версии
.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