2012-07-06 22 views
15

Arama yönteminin tam adını C# olarak nasıl bulabilirim. Ben çözümler gördük:Arama yönteminin tam adı nasıl bulunur C#

How I can get the calling methods in C#

How can I find the method that called the current method?

Get Calling function name from Called function

Ama sadece bana üst düzey verin. örneği inceleyelim:

namespace Sandbox 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      test(); 
     } 

     static void test() 
     { 
      var stackTrace = new StackTrace(); 
      var methodBase = stackTrace.GetFrame(1).GetMethod(); 
      Console.WriteLine(methodBase.Name); 
     } 
    } 
} 

Bu sadece çıktılar 'Ana' nasıl 'Sandbox.Program.Main' yazdırmaya alabilirim?

Herkes neden bunu kullanmam gerektiğini sormadan önce, üzerinde çalıştığım basit bir günlük çerçevesi için. Matzi en Yanıt üzerine ekleme

DÜZENLEME

: bundan bir şey

+1

olası yinelenen ad [Get System.Reflection kullanarak Yöntem Tam Adı] (http://stackoverflow.com/questions/2968352/using-system-reflection-to-get-a-methods-full -name) – user7116

cevap

27

olduğunu gerektiği gibi

namespace Sandbox 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      test(); 
     } 

     static void test() 
     { 
      var stackTrace = new StackTrace(); 
      var methodBase = stackTrace.GetFrame(1).GetMethod(); 
      var Class = methodBase.ReflectedType; 
      var Namespace = Class.Namespace;   //Added finding the namespace 
      Console.WriteLine(Namespace + "." + Class.Name + "." + methodBase.Name); 
     } 
    } 
} 

'Sandbox.Program.Main' üretir: Burada

çözümdür here gibi.

MethodBase method = stackTrace.GetFrame(1).GetMethod(); 
string methodName = method.Name; 
string className = method.ReflectedType.Name; 

Console.WriteLine(className + "." + methodName); 
+0

Teşekkürler! Soruyu, Ad Alanı'nı bulmayı nasıl düşündüğümü eklemek için düzenledim. –

+2

Çalışmıyor. Yöntem, çağrı yöntemi olmayabilir, ancak dışardakilerden biri olabilir - çağrı yöntemi artık mevcut olmayabilir, yani belirtilmiş olabilir. – TomTom

+0

İç içe geçmiş sınıflar da mümkün mü? Programın içinde bir sınıf yapsaydım, 'Foo' diyelim, Ve 'Foo' ('' '' '' '' '' '' '' '' '' '''''''''' olarak adlandırın '' diyen bir metodum var 'Program.test()' 'Yazdır' 'Sandbox.Program.Foo .Bar ' –

0

Eğer sınıfları vb kullanarak çağrı yığını hakkında tam bilgi bulabilirsiniz GetCurrentMethodSystem.Reflection.MethodBase yöntemde

+0

Nasıl? ['GetCurrentMethod'] (https://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod (v = vs.110) .aspx) bir [' MethodBase'] döndürür (https://msdn.microsoft.com/en-us/library/system.reflection.methodbase(v=vs.110).aspx) yığın iziyle ilgili herhangi bir şey göstermiyor gibi görünüyor (geçerli tür hariç). – c24w

4

Ben tam adını almak için en iyi yol olduğunu düşünüyorum:

this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name; 

veya bu

deneyin
string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name); 
0

Bu yöntemle, tam olarak güvenilir bir şekilde alabilirsiniz. arasında

public void HandleException(Exception ex, [CallerMemberName] string caller = "") 
    { 
     if (ex != null) 
     { 
      while (ex.InnerException != null) 
       ex = ex.InnerException; 

      foreach (var method in new StackTrace().GetFrames()) 
      { 
       if (method.GetMethod().Name == caller) 
       { 
        caller = $"{method.GetMethod().ReflectedType.Name}.{caller}"; 
        break; 
       } 
      } 

      Console.WriteLine($"Exception: {ex.Message} Caller: {caller}()"); 
     } 
    } 
İlgili konular