我注意到.NET 4.5有一个名为 [CallerMemberNameAttribute] 的新属性,当附加到方法的参数时,它将提供调用的方法的字符串名称方法(如果有意义的话)。
然而,不幸的是(因为我想用XNA制作东西)我只针对.NET 4.0。
我希望能够做到这样的事情:
void MethodA() {
MethodB();
}
void MethodB() {
string callingMethodName = (...?);
Console.WriteLine(callingMethodName);
}
我的输出是 MethodA 。
我知道我可以通过堆栈跟踪来做到这一点,但那是a)不可靠和b)Sloooow ...... 所以我想知道是否还有其他方法可以收集这些信息,但这可能是......
我希望任何人可能对此问题有任何想法或知识。在此先感谢:)
答案 0 :(得分:13)
如果使用Visual Studio 2012进行编译,则可以编写自己的CallerMemberNameAttribute
并使用与.NET 4.5相同的方法,即使您仍然以.NET 4.0或3.5为目标。编译器仍将在编译时执行替换,甚至针对较旧的框架版本。
只需将以下内容添加到项目中即可:
namespace System.Runtime.CompilerServices
{
public sealed class CallerMemberNameAttribute : Attribute { }
}
答案 1 :(得分:0)
您可以将调用者名称作为参数提供给被调用方法。不是你要求的,但它无需访问堆栈框架即可运行:
[MethodImpl(MethodImplOptions.NoInlining)]
void MethodA()
{
string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name;
MethodB(methodName);
}
void MethodB(string callingMethodName)
{
Console.WriteLine(callingMethodName);
}
通过使用MethodBase.GetCurrentMethod()
,您可以确保您的实现保持重构安全 - 如果您的方法名称发生更改,结果仍然是正确的。
不要忘记使用MethodImplOptions.NoInlining
标记您的调用方法,以避免方法内联。