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 .

C#
public abstract System.Reflection.MethodInfo GetBaseDefinition();

Döndürülenler

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

Uygulamalar

Örnekler

Aşağıdaki örnekte yönteminin davranışı gösterilmektedir GetBaseDefinition .

C#
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

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 nesnede özelliğinin 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öntemi 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üğüyle 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, yöntemini temsil eden bir MethodInfo nesnede ç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.

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

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, yönteminden Type.GetMethods tüm yöntemlerin bir dizisini alıp dizideki öğeleri yineleyerek veya yöntemini çağırıp Type.GetMethod(String) yöntem adını belirterek yöntemi doğrudan temsil eden nesneyi 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

Ürün Sürümler
.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.5, 1.6, 2.0, 2.1

Ayrıca bkz.