Как найти FULL имя метода вызова С#

Как найти полное имя вызывающего метода в С#. Я видел решения:

Как я могу получить вызовы в С#

Как найти метод, который вызвал текущий метод?

Получить имя функции вызова из вызываемой функции

Но они только дают мне верхний уровень. Рассмотрим пример:

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);
 }
 }
}

Это просто выводит "Main". Как я могу заставить его печатать "Sandbox.Program.Main"?

Прежде чем кто-нибудь начнет спрашивать, зачем мне это нужно, его для простой структуры ведения журнала, над которой я работаю.

ИЗМЕНИТЬ

Добавление на Matzi Ответ:

Вот решение:

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);
 }
 }
}

Создает "Песочницу". "Программа". Как правило, она должна

4 ответа

Это что-то вроде здесь.

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


Я думаю, что лучший способ получить полное имя:

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

или попробуйте это

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


в System.Reflection.MethodBase методе GetCurrentMethod вы можете найти полную информацию о callstack, используя классы и т.д.


С помощью этого метода вы можете надежно получить полное имя

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}()");
 }
 }

licensed under cc by-sa 3.0 with attribution.