Ответ 1
Console.WriteLine(new StackFrame().GetMethod().DeclaringType);
Возможно ли напечатать имя класса из статической функции?
e.g...
public class foo
{
static void printName()
{
// Print the class name e.g. foo
}
}
Console.WriteLine(new StackFrame().GetMethod().DeclaringType);
У вас есть три способа получить тип (и, следовательно, имя) YourClass
, который работает в статической функции:
typeof(YourClass)
- быстрый (0,043 микросекунды)
MethodBase.GetCurrentMethod().DeclaringType
- медленный (2,3 микросекунды)
new StackFrame().GetMethod().DeclaringType
- самый медленный (17,2 микросекунды)
Если использование typeof(YourClass)
нежелательно, то MethodBase.GetCurrentMethod().DeclaringType
, безусловно, лучший вариант.
В то время как ответы StackTrace верны, у них есть накладные расходы. Если вы просто хотите избежать изменения имени, рассмотрите typeof(foo).Name
. Поскольку статические методы не могут быть виртуальными, обычно это нормально.
A (чистая, IMO) альтернатива (все еще медленная, как черт возьми, и я бы съежился, если бы увидел это в базе производственного кода):
Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType);
Кстати, если вы делаете это для ведения журнала, некоторые фреймворки регистрации (например, log4net) имеют встроенную возможность. И да, они предупреждают вас в документах, что это потенциальный кошмар производительности.
StackTrace класс может это сделать.
Поскольку статические методы не могут быть унаследованы, имя класса будет известно вам при написании метода. Почему бы просто не переустановить его?