类A的Log方法能否知道调用它的人是谁?
class A
{
public void Log(string msg)
{
Log.Write("method_name: " + msg);
}
}
我想知道一个类的名称和一个方法的名称。
类A的Log方法能否知道调用它的人是谁?
class A
{
public void Log(string msg)
{
Log.Write("method_name: " + msg);
}
}
我想知道一个类的名称和一个方法的名称。
StackTrace
和 StackFrame
类。您可以通过调用 StrackTrace
构造函数来获取整个堆栈跟踪,或者使用带有要跳过的帧数的 StackFrame
构造函数来获取特定的堆栈帧。using System;
using System.Diagnostics;
class Test
{
static void ShowCaller()
{
// Use this code if you want multiple frames
// StackTrace trace = new StackTrace();
// StackFrame frame = trace.GetFrame(1);
// Use this code if you're only interested in one frame
StackFrame frame = new StackFrame(1);
Console.WriteLine(frame.GetMethod());
}
static void Intermediate()
{
ShowCaller();
}
static void Main()
{
Intermediate();
}
}
在运行优化版本的构建时,这将打印Void Main()
- 在运行调试构建时,或者如果您将更多代码放入Intermediate()
方法中,它将打印Void Intermediate()
。
(如评论中所述,这也会带来性能影响。您应该进行测量以确定在您的特定情况下是否可接受。)
Log
。 - Chris Schmich你也可以尝试:
class staitc A
{
public staitc void Log(string msg)
{
Log.Write("method_name: " + msg);
}
}
using System.Reflection;
class TestClass
{
// in method
private void TestMethod()
{
A.Log(MethodBase.GetCurrentMethod().Name +MethodBase.GetCurrentMethod().DeclaringType.FullName);
}
}
从.NET 4.5开始,您可以通过CallerMemberNameAttribute
获取调用者信息,该属性是System.Runtime.CompilerServices
命名空间的一部分:
using System.Runtime.CompilerServices;
class A
{
public void Log(string msg, [CallerMemberName] string memberName = "")
{
Log.Write("{0}: {1}", memberName, msg);
}
}
可以 - 通过创建一个新的StackTrace
对象,然后使用stackTrace.GetFrame(1).GetMethod().Name
- 不过,这可能是一项昂贵的操作,因此请测试并检查它是否会导致您的应用程序不必要的减速。
Log.Write
应该尽可能地廉价,因为您希望它可用于非错误日志记录。通常的方法是让它尽快返回,将日志条目放入由单个线程(可能具有较低优先级)写入的队列中。 - Steven Sudit
Log
方法,它有公共方法来记录特定严重性代码,比如Fail
、Warn
等等。这些公共方法有 NoInlining 属性,以便Log
可以查看 两个 调用者,无论是在调试还是发布模式下。希望能澄清事情。 - Steven SuditFoo
调用一个记录了Fail
的短Bar
,我们可能会得到提到Foo
而不是Bar
的结果。 - Steven Sudit