MethodInfo.GetBaseDefinition Yöntem

Tanım

Türetilmiş bir sınıfta geçersiz kılındığında, bu örnek tarafından temsil edilen yöntemin ilk bildirildiği doğrudan veya dolaylı temel sınıfta yönteminin nesnesini döndürür 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

Döndürülenler

MethodInfo Bu yöntemin ilk uygulaması için bir nesnesi.

Uygulamalar

Örnekler

Aşağıdaki örnekte yönteminin davranışı gösterilmektedir 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

Açıklamalar

yöntemi, GetBaseDefinition sınıf hiyerarşisinde belirtilen yöntemin ilk tanımını döndürür. Döndürülen MethodInfo nesnedeki özelliğin değerini alarak yöntemin ilk tanımının DeclaringType bulunduğu türü belirleyebilirsiniz.

GetBaseDefinition yöntemi aşağıdaki gibi davranır:

  • Geçerli MethodInfo nesne bir arabirim uygulamasını temsil ederse, GetBaseDefinition yöntemi geçerli MethodInfo nesneyi döndürür.

  • Geçerli MethodInfo nesne bir temel sınıftaki sanal tanımı geçersiz kılan bir yöntemi temsil ederse, GetBaseDefinition yöntem sanal tanımı temsil eden bir MethodInfo nesne döndürür.

  • Geçerli MethodInfo nesne, C# dilinde anahtar sözcüğüyle veya Shadows Visual Basic'teki anahtar sözcükle new (Ortak Tür Sistemi'nde açıklandığı gibinewslot) GetBaseDefinition belirtilen bir yöntemi temsil ederse, yöntem geçerli MethodInfo nesneyi döndürür.

  • Geçerli MethodInfo nesne devralınan bir yöntemi temsil ederse (yani, geçerli yöntem kendi uygulamasını sağlamaz), GetBaseDefinition yöntem sınıf hiyerarşisindeki en düşük yöntemi temsil eden bir MethodInfo nesne döndürür. Örneğin, öğesini geçersiz kılarsa Object.ToStringve Derived.ToString geçersiz kılarsaBase.ToStringBase.ToString, öğesini temsil eden bir MethodInfo nesne üzerinde yöntemini çağırarak GetBaseDefinition öğesini temsil Derived.ToStringObject.ToStringeden bir MethodInfo nesne döndürür.

  • Geçerli MethodInfo nesne herhangi bir temel sınıfta mevcut olmayan bir yöntemi temsil ederse, GetBaseDefinition yöntem geçerli MethodInfo nesneyi döndürür.

Yöntemini çağırarak GetBaseDefinition geçerli yöntemin temel sınıftaki bir yöntemi geçersiz kılıp geçersiz kılmayacağını belirleyebilirsiniz. Aşağıdaki örnek, bunu sağlayan bir IsOverride yöntem uygular.

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

yöntemini çağırmak GetBaseDefinition için:

  1. özelliğini içeren türü (sınıf veya yapı) temsil eden bir Type nesne alın. Bir nesneyle (bir türün örneği) çalışıyorsanız, yöntemini çağırabilirsiniz GetType . Aksi takdirde, örnekte gösterildiği gibi C# işlecini veya Visual Basic GetType işlecini kullanabilirsiniz.

  2. İlgilendiğiniz yöntemi temsil eden bir MethodInfo nesne alın. Bunu yapmak için yönteminden Type.GetMethods tüm yöntemlerin bir dizisini alıp dizideki öğeleri yineleyebilir veya yöntemini çağırıp Type.GetMethod(String) yöntem adını belirterek yöntemi temsil eden nesneyi doğrudan alabilirsinizMethodInfo.

  3. GetBaseDefinition Temel yöntem tanımını temsil eden nesnenin MethodInfo değerini almak için yöntemini çağırın.

Şunlara uygulanır

Ayrıca bkz.