Ответ 1
Это что-то вроде здесь.
MethodBase method = stackTrace.GetFrame(1).GetMethod();
string methodName = method.Name;
string className = method.ReflectedType.Name;
Console.WriteLine(className + "." + methodName);
Как найти полное имя вызывающего метода в С#. Я видел решения:
Как я могу получить вызовы в С#
Как найти метод, который вызвал текущий метод?
Получить имя функции вызова из вызываемой функции
Но они только дают мне верхний уровень. Рассмотрим пример:
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);
}
}
}
Создает "Песочницу". "Программа". Как правило, она должна
Это что-то вроде здесь.
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}()");
}
}