英語で読む

次の方法で共有


MethodBase.IsVirtual プロパティ

定義

メソッドが virtual であるかどうかを示す値を取得します。

C#
public bool IsVirtual { get; }

プロパティ値

このメソッドが virtual である場合は true。それ以外の場合は false

実装

次の例では、 falseIsFinalが表示されます。これにより、オーバーライド MyMethod 可能であると考える可能性があります。 がマークvirtualされていないため、オーバーライドできませんがMyMethod、コードは出力falseされます。

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

注釈

仮想メンバーは、クラス内のインスタンス データを参照できます。また、 クラスのインスタンスを介して参照する必要があります。

メソッドがオーバーライド可能かどうかを判断するには、 をチェックIsVirtualtrueするだけでは十分ではありません。 メソッドをオーバーライドできるようにするには、 IsVirtual と を にする必要があります trueIsFinalfalse。 たとえば、メソッドは非仮想ですが、インターフェイス メソッドを実装します。 共通言語ランタイムでは、インターフェイス メンバーを実装するすべてのメソッドを として virtualマークする必要があります。したがって、コンパイラは メソッド virtual finalをマークします。 そのため、メソッドが として virtual マークされているが、引き続きオーバーライドできない場合があります。

メソッドがオーバーライド可能かどうかを確実に確立するには、次のようなコードを使用します。

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

false または IsFinal の場合IsVirtualtrueメソッドをオーバーライドすることはできません。

現在のメソッドが基底クラスのメソッドをオーバーライドするかどうかを判断するには、 メソッドを MethodInfo.GetBaseDefinition 呼び出します。 次の例では、これを行うメソッドを実装します IsOverride

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

適用対象

製品 バージョン
.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