Возможно ли напечатать имя класса из статической функции?C# распечатать имя класса из статической функции
... например
public class foo
{
static void printName()
{
// Print the class name e.g. foo
}
}
Возможно ли напечатать имя класса из статической функции?C# распечатать имя класса из статической функции
... например
public class foo
{
static void printName()
{
// Print the class name e.g. foo
}
}
Console.WriteLine(new StackFrame().GetMethod().DeclaringType);
StackTrace класс может сделать это.
Хотя ответы StackTrace верны, у них есть накладные расходы. Если вы просто хотите безопасности от изменения имени, рассмотрите typeof(foo).Name
. Поскольку статические методы не могут быть виртуальными, это должно быть нормально.
Это хороший момент. Очевидно, что если вы контролируете метод, вы управляете именем класса, поэтому все это немного академично. –
Все, что я использую для этого, это для журнала исключительного поведения, поэтому я могу жить с накладными расходами на использование метода Stack Trace, поскольку выполнение (возможно) прекратится после этой активности ведения журнала. –
этот не работает, если код вставлен в другой класс, и вы забыли, что у вас есть этот код. –
A (уборщик, IMO) альтернатива (по-прежнему медленно, как ад, и я бы съеживаются, если бы я видел это в производственной базе кода):
Кстати, если вы делаете это для регистрации , некоторые структуры ведения журнала (например, log4net) имеют встроенную возможность. И да, они предупреждают вас в документах, что это потенциальный кошмар производительности.
Поскольку статические методы не могут быть унаследованы, имя класса будет известно вам при написании метода. Почему бы просто не переустановить его?
Статические методы могут быть унаследованы жестко., И если вы хотите вызвать статический метод подкласса, вам не повезло – systemkern
@systemkern - Извините, я этого не понимал. Даже если вы вызываете метод «через» подкласс (например, «SubClass.BaseClassStaticMethod();')), фактический код IL будет по-прежнему выглядеть так, как вы его вызывали из базового класса. Это просто синтаксический сахар от компилятора C#.Нет никакого способа, чтобы _actually_ вызвать метод «через подкласс» и, таким образом, никоим образом не изнутри метода выяснить, что вызывающий код C# был написан таким образом. –
Да, это правда, но это может быть именно точка , вы можете иметь немного другое поведение, если вы вызываете SubClassAA.BaseClassStaticMethod(), чем если вы вызываете SubClassBB.BaseClassStaticMethod(). Это может быть не очень, но иногда необходимо, потому что у вас нет полного контроля над подклассом ... из-за «причин» – systemkern
У вас есть три варианта, чтобы получить тип (и, следовательно, имя) YourClass
, которые работают в статической функции:
typeof(YourClass)
- быстрая (0.043 микросекунд)
MethodBase.GetCurrentMethod().DeclaringType
- медленный (2.3 микросекунды)
new StackFrame().GetMethod().DeclaringType
- медленный (17,2 микросекунд)
Если использование typeof(YourClass)
нежелательно, то MethodBase.GetCurrentMethod().DeclaringType
, безусловно, лучший вариант.
Как отметил @Jamezor, это может быть кошмар. ура – systemkern