是否可以在静态函数中打印类名?
例如......
public class foo
{
static void printName()
{
// Print the class name e.g. foo
}
}
答案 0 :(得分:53)
您有三个选项可以获取在静态函数中工作的YourClass
的类型(以及名称):
typeof(YourClass)
- 快速(0.043微秒)
MethodBase.GetCurrentMethod().DeclaringType
- 慢(2.3微秒)
new StackFrame().GetMethod().DeclaringType
- 最慢(17.2微秒)
如果不希望使用typeof(YourClass)
,则MethodBase.GetCurrentMethod().DeclaringType
绝对是最佳选择。
答案 1 :(得分:21)
Console.WriteLine(new StackFrame().GetMethod().DeclaringType);
答案 2 :(得分:11)
虽然StackTrace的答案是正确的,但它们确实有开销。如果您只想安全地更改名称,请考虑typeof(foo).Name
。由于静态方法不能是虚拟的,所以通常应该没问题。
答案 3 :(得分:6)
一个(清洁,IMO)的替代方案(如果我在生产代码库中看到这个,那么我还会感到畏缩):
Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType);
顺便说一句,如果您正在执行此操作以进行日志记录,则某些日志记录框架(例如log4net)具有内置功能。是的,他们在文档中警告您这可能是性能噩梦。
答案 4 :(得分:2)
StackTrace类可以做到这一点。
答案 5 :(得分:2)
自C#6.0起,使用nameof
关键字,存在一种更简单,更快速的方式来获取类型名称作为字符串,而无需在代码中键入字符串文字:
raise KeyError
答案 6 :(得分:-2)
由于无法继承静态方法,因此在编写方法时您将知道类名。为什么不直接硬编码呢?