c # вывести имя класса из статической функции - PullRequest
27 голосов
/ 16 февраля 2009

Можно ли напечатать имя класса из статической функции?

например ...

public class foo
{

    static void printName()
    {
        // Print the class name e.g. foo
    }

}

Ответы [ 7 ]

53 голосов
/ 02 мая 2012

У вас есть три варианта получения типа (и, следовательно, имени) YourClass, которые работают в статической функции:

  1. typeof(YourClass) - быстро (0,043 микросекунды)

  2. MethodBase.GetCurrentMethod().DeclaringType - медленно (2,3 микросекунды)

  3. new StackFrame().GetMethod().DeclaringType - самый медленный (17,2 микросекунд)


Если использование typeof(YourClass) нежелательно, тогда MethodBase.GetCurrentMethod().DeclaringType, безусловно, лучший вариант.

21 голосов
/ 16 февраля 2009
Console.WriteLine(new StackFrame().GetMethod().DeclaringType);
11 голосов
/ 16 февраля 2009

Несмотря на то, что ответы StackTrace верны, они имеют накладные расходы. Если вы просто хотите обезопасить себя от смены имени, подумайте typeof(foo).Name. Поскольку статические методы не могут быть виртуальными, обычно это нормально.

6 голосов
/ 16 февраля 2009

Альтернатива (чище, IMO) (все еще медленная до чертиков, и я бы съежился, если бы увидел это в базе производственного кода):

Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType);

Кстати, если вы делаете это для ведения журналов, некоторые каркасы ведения журналов (например, log4net) имеют встроенную возможность. И да, они предупреждают вас в документации, что это потенциальный кошмар производительности.

2 голосов
/ 29 ноября 2018

Начиная с C # 6.0, существует еще более простой и быстрый способ получения имени типа в виде строки без ввода строкового литерала в коде с использованием ключевого слова nameof:

public class Foo
{
    static void PrintName()
    {
        string className = nameof(Foo);
        ...
    }
}
2 голосов
/ 16 февраля 2009

StackTrace класс может сделать это.

0 голосов
/ 16 февраля 2009

Поскольку статические методы не могут быть унаследованы, имя класса будет вам известно при написании метода. Почему бы просто не сделать это жестко?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...