MethodInfo.GetBaseDefinition 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在衍生類別中覆寫時,為直接或間接基底類別 (也就是這個執行個體所代表的方法第一次被宣告的地方) 中的方法傳回 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 物件代表以 C# 中的 關鍵詞指定的
new
方法,或Shadows
Visual Basic 中的 關鍵詞 (newslot
,如 中的一 般類型系統) 中所述,此方法會 GetBaseDefinition 傳回目前的 MethodInfo 物件。如果目前的 MethodInfo 物件代表繼承的方法 (也就是說,目前的方法不會提供自己的實作) ,則方法會GetBaseDefinitionMethodInfo傳回物件,該物件代表類別階層中最低的方法。 例如,如果
Base.ToString
覆寫Object.ToString
、 和Derived.ToString
會覆寫Base.ToString
,則呼叫 GetBaseDefinition 代表Derived.ToString
之物件上的 MethodInfo 方法會MethodInfo傳回代表Object.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# 運算符或 Visual Basic GetType 運算符,如範例所示。
MethodInfo取得物件,表示您感興趣的方法。 您可以從 方法取得所有方法 Type.GetMethods 的陣列,然後逐一查看陣列中的專案,或者您可以 MethodInfo 呼叫 Type.GetMethod(String) 方法並指定方法名稱,來擷取直接代表方法的物件。
GetBaseDefinition呼叫 方法,以取得代表基底方法定義的物件值MethodInfo。