我如何才能找到在C#中调用方法的全名。 我见过的解决方案:
我怎样才能获得在C#中调用方法
我怎么能找到调用当前方法的方法?
得到调用的函数调用函数名
但是,他们只给我的最高水平。 考虑例如:
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);
}
}
}
这只是输出“主”我怎样才能得到它打印“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);
}
}
}
产生“Sandbox.Program.Main”像它应该
这有点像在这里 。
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);
如果你想显示最近的函数调用,您可以使用:
StackTrace st = new StackTrace();
StackFrame sf = st.GetFrame(0);
var methodName = sf.GetMethod();
,但如果你想显示调用函数的树,你可以做这样的:
if (st.FrameCount >1)
{
// Display the highest-level function call
// in the trace.
StackFrame sf = st.GetFrame(st.FrameCount-1);
Console.WriteLine(" Original function call at top of call stack):");
Console.WriteLine(" {0}", sf.GetMethod());
}
更多信息
在System.Reflection.MethodBase
方法GetCurrentMethod
你可以找到使用类等有关调用栈的全部信息
使用这种方法,你可以得到可靠的全名
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}()");
}
}
当前调用的命名空间不等于作为当前命名空间
var mNamespace = new StackTrace().GetFrames()?.Select(x =>
{
try
{
return x.GetMethod().ReflectedType?.Namespace;
}
catch (Exception)
{
return string.Empty;
}
}).First(x => x != new StackTrace().GetFrame(0).GetMethod().ReflectedType?.Namespace);