MethodBase.IsVirtual 속성
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
메서드가 virtual
인지 여부를 나타내는 값을 가져옵니다.
public:
property bool IsVirtual { bool get(); };
public bool IsVirtual { get; }
member this.IsVirtual : bool
Public ReadOnly Property IsVirtual As Boolean
속성 값
이 메서드가 virtual
이면 true
이고, 그렇지 않으면 false
입니다.
구현
예제
다음 예제에서는 에 대해 IsFinal
를 표시 false
합니다. 이 경우 재정의할 수 있다고 MyMethod
생각할 수 있습니다. 가 표시되지 virtual
않았더라도 MyMethod
코드가 인쇄 false
되므로 재정의할 수 없습니다.
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
설명
가상 멤버는 클래스의 instance 데이터를 참조할 수 있으며 클래스의 instance 통해 참조되어야 합니다.
메서드를 재정의할 수 있는지 확인하려면 검사 충분하지 IsVirtual
true
않습니다. 재정의할 수 있는 메서드의 경우 는 IsVirtual
이어야 true
하며 IsFinal 이어야 합니다 false
. 예를 들어 메서드는 가상이 아니지만 인터페이스 메서드를 구현합니다. 공용 언어 런타임을 사용하려면 인터페이스 멤버를 구현하는 모든 메서드를 로 virtual
표시해야 합니다. 따라서 컴파일러는 메서드 virtual final
를 표시합니다. 따라서 메서드가 로 virtual
표시되지만 여전히 재정의할 수 없는 경우가 있습니다.
메서드를 재정의할 수 있는지 여부를 확실하게 설정하려면 다음과 같은 코드를 사용합니다.
if (MethodInfo.IsVirtual && !MethodInfo.IsFinal)
If MethodInfo.IsVirtual AndAlso Not MethodInfo.IsFinal Then
가 false
또는 IsFinal
이true
면 IsVirtual
메서드를 재정의할 수 없습니다.
현재 메서드가 메서드를 호출 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
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
적용 대상
.NET