【发布时间】:2010-10-07 20:20:16
【问题描述】:
是否可以从静态函数中打印类名?
例如...
public class foo
{
static void printName()
{
// Print the class name e.g. foo
}
}
【问题讨论】:
是否可以从静态函数中打印类名?
例如...
public class foo
{
static void printName()
{
// Print the class name e.g. foo
}
}
【问题讨论】:
从 C# 6.0 开始,有一种更简单、更快捷的方法可以将类型名称作为字符串获取,而无需在代码中键入字符串文字,使用 nameof 关键字:
public class Foo
{
static void PrintName()
{
string className = nameof(Foo);
...
}
}
【讨论】:
您有三个选项来获取在静态函数中工作的YourClass 的类型(以及名称):
typeof(YourClass) - 快速(0.043 微秒)
MethodBase.GetCurrentMethod().DeclaringType - 慢(2.3 微秒)
new StackFrame().GetMethod().DeclaringType - 最慢(17.2 微秒)
如果不希望使用typeof(YourClass),那么MethodBase.GetCurrentMethod().DeclaringType 绝对是最佳选择。
【讨论】:
一个(更清洁的,IMO)替代方案(仍然慢得要命,如果我在生产代码库中看到这个我会畏缩):
Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType);
顺便说一句,如果您这样做是为了进行日志记录,一些日志记录框架(例如 log4net)具有内置功能。是的,它们在文档中警告您这是一个潜在的性能噩梦。
【讨论】:
由于静态方法不能被继承,所以当你编写方法时你会知道类名。为什么不直接硬编码呢?
【讨论】:
SubClass.BaseClassStaticMethod();)调用该方法,实际的 IL 代码仍将像您从基类调用它一样。它只是 C# 编译器的语法糖。没有办法实际上“通过子类”调用方法,因此无法从方法内部找出调用的 C# 代码是这样编写的。
虽然 StackTrace 的答案是正确的,但它们确实存在开销。如果您只是想安全地避免更改名称,请考虑typeof(foo).Name。由于静态方法不能是虚拟的,这通常应该没问题。
【讨论】:
typeof(foo).Name 或typeof(foo).Something 代码是更大逻辑的一部分,并且在某些时候您决定该逻辑最好在另一个类中完成。您不会注意到您需要更改它,因为代码仍会编译
Console.WriteLine(new StackFrame().GetMethod().DeclaringType);
【讨论】:
StackTrace 类可以做到这一点。
【讨论】: