A类的Log方法可以知道是谁调用它吗?
class A
{
public void Log(string msg)
{
Log.Write("method_name: " + msg);
}
}
我想知道类的名称和方法的名称。
答案 0 :(得分:4)
您可以使用StackTrace
和StackFrame
课程。您可以通过调用StrackTrace
构造函数获取整个堆栈跟踪,也可以使用StackFrame
构造函数获取整个堆栈帧,该构造函数将跳过帧数。
您应该知道,由于内联,它可能不准确。 (例如,方法A内联方法B调用您的方法 - 方法A将被报告,而不是B)。
示例代码:
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()
。< / p>
(正如评论中所提到的,这也会造成性能损失。你应该测量它以确定它在你的特定情况下是否可以接受。)
答案 1 :(得分:2)
答案 2 :(得分:1)
您也可以尝试:
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);
}
}
答案 3 :(得分:0)
是的,它可以 - 通过创建一个新的StackTrace
对象,然后使用stackTrace.GetFrame(1).GetMethod().Name
- 但是,这可能是一个昂贵的操作,所以测试并检查它不会导致你的过度减速应用
答案 4 :(得分:0)
启动.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);
}
}