MethodInfo.GetBaseDefinition Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
При переопределении в производном классе возвращает MethodInfo объект для метода прямого или косвенного базового класса, в котором метод, представленный этим экземпляром, был впервые объявлен.
public:
abstract System::Reflection::MethodInfo ^ GetBaseDefinition();
public abstract System.Reflection.MethodInfo GetBaseDefinition();
abstract member GetBaseDefinition : unit -> System.Reflection.MethodInfo
Public MustOverride Function GetBaseDefinition () As MethodInfo
Возвращаемое значение
MethodInfo Объект для первой реализации этого метода.
Реализации
Примеры
В следующем примере показано поведение GetBaseDefinition метода.
using System;
using System.Reflection;
interface Interf
{
string InterfaceImpl(int n);
}
public class BaseClass
{
public override string ToString()
{
return "Base";
}
public virtual void Method1()
{
Console.WriteLine("Method1");
}
public virtual void Method2()
{
Console.WriteLine("Method2");
}
public virtual void Method3()
{
Console.WriteLine("Method3");
}
}
public class DerivedClass : BaseClass, Interf
{
public string InterfaceImpl(int n)
{
return n.ToString("N");
}
public override void Method2()
{
Console.WriteLine("Derived.Method2");
}
public new void Method3()
{
Console.WriteLine("Derived.Method3");
}
}
public class Example
{
public static void Main()
{
Type t = typeof(DerivedClass);
MethodInfo m, mb;
string[] methodNames = { "ToString", "Equals", "InterfaceImpl",
"Method1", "Method2", "Method3" };
foreach (var methodName in methodNames) {
m = t.GetMethod(methodName);
mb = m.GetBaseDefinition();
Console.WriteLine("{0}.{1} --> {2}.{3}", m.ReflectedType.Name,
m.Name, mb.ReflectedType.Name, mb.Name);
}
}
}
// The example displays the following output:
// DerivedClass.ToString --> Object.ToString
// DerivedClass.Equals --> Object.Equals
// DerivedClass.InterfaceImpl --> DerivedClass.InterfaceImpl
// DerivedClass.Method1 --> BaseClass.Method1
// DerivedClass.Method2 --> BaseClass.Method2
// DerivedClass.Method3 --> DerivedClass.Method3
Imports System.Reflection
Interface Interf
Function InterfaceImpl(n As Integer) As String
End Interface
Public Class BaseClass
Public Overrides Function ToString() As String
Return "Base"
End Function
Public Overridable Sub Method1()
Console.WriteLine("Method1")
End Sub
Public Overridable Sub Method2()
Console.WriteLine("Method2")
End Sub
Public Overridable Sub Method3()
Console.WriteLine("Method3")
End Sub
End Class
Public Class DerivedClass : Inherits BaseClass : Implements Interf
Public Function InterfaceImpl(n As Integer) As String _
Implements Interf.InterfaceImpl
Return n.ToString("N")
End Function
Public Overrides Sub Method2()
Console.WriteLine("Derived.Method2")
End Sub
Public Shadows Sub Method3()
Console.WriteLine("Derived.Method3")
End Sub
End Class
Module Example
Public Sub Main()
Dim t As Type = GetType(DerivedClass)
Dim m, mb As MethodInfo
Dim methodNames() As String = { "ToString", "Equals",
"InterfaceImpl", "Method1",
"Method2", "Method3" }
For Each methodName In methodNames
m = t.GetMethod(methodName)
mb = m.GetBaseDefinition()
Console.WriteLine("{0}.{1} --> {2}.{3}", m.ReflectedType.Name,
m.Name, mb.ReflectedType.Name, mb.Name)
Next
End Sub
End Module
' The example displays the following output:
' DerivedClass.ToString --> Object.ToString
' DerivedClass.Equals --> Object.Equals
' DerivedClass.InterfaceImpl --> DerivedClass.InterfaceImpl
' DerivedClass.Method1 --> BaseClass.Method1
' DerivedClass.Method2 --> BaseClass.Method2
' DerivedClass.Method3 --> DerivedClass.Method3
Комментарии
Метод GetBaseDefinition возвращает первое определение указанного метода в иерархии классов. Вы можете определить тип, на котором найдено первое определение метода, извлекая значение DeclaringType свойства для возвращаемого MethodInfo объекта.
Метод GetBaseDefinition ведет себя следующим образом:
Если текущий MethodInfo объект представляет реализацию интерфейса, GetBaseDefinition метод возвращает текущий MethodInfo объект.
Если текущий MethodInfo объект представляет метод, переопределяющий виртуальное определение в базовом классе, GetBaseDefinition метод возвращает MethodInfo объект, представляющий виртуальное определение.
Если текущий MethodInfo объект представляет метод, указанный с
newключевым словом в C# илиShadowsключевым словом в Visual Basic (как описано вnewslotcommon Type System), GetBaseDefinition метод возвращает текущий MethodInfo объект.Если текущий MethodInfo объект представляет унаследованный метод (то есть текущий метод не предоставляет собственную реализацию), GetBaseDefinition метод возвращает MethodInfo объект, представляющий самый низкий метод в иерархии классов. Например, если переопределяется и переопределяется
Base.ToString, вызывая GetBaseDefinition метод для MethodInfo объекта, представляющего объектMethodInfo, представляющий объект, представляющийDerived.ToStringObject.ToString.Derived.ToStringObject.ToStringBase.ToStringЕсли текущий MethodInfo объект представляет метод, который отсутствует в базовом классе, GetBaseDefinition метод возвращает текущий 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
Чтобы вызвать метод, выполните следующие действия GetBaseDefinition .
Type Получение объекта, представляющего тип (класс или структуру), содержащий свойство. Если вы работаете с объектом (экземпляром типа), можно вызвать его GetType метод. В противном случае можно использовать оператор C# или оператор GetType Visual Basic, как показано в примере.
Получите объект, представляющий интересующий MethodInfo вас метод. Это можно сделать, получив массив всех методов из Type.GetMethods метода, а затем итерацию элементов в массиве, или получить MethodInfo объект, представляющий метод непосредственно путем вызова Type.GetMethod(String) метода и указания имени метода.
GetBaseDefinition Вызовите метод, чтобы получить значение MethodInfo объекта, представляющего определение базового метода.