2009-02-16 11 views

ответ

20
Console.WriteLine(new StackFrame().GetMethod().DeclaringType); 
+4

Как отметил @Jamezor, это может быть кошмар. ура – systemkern

11

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

+0

Это хороший момент. Очевидно, что если вы контролируете метод, вы управляете именем класса, поэтому все это немного академично. –

+0

Все, что я использую для этого, это для журнала исключительного поведения, поэтому я могу жить с накладными расходами на использование метода Stack Trace, поскольку выполнение (возможно) прекратится после этой активности ведения журнала. –

+0

этот не работает, если код вставлен в другой класс, и вы забыли, что у вас есть этот код. –

6

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

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

-3

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

+0

Статические методы могут быть унаследованы жестко., И если вы хотите вызвать статический метод подкласса, вам не повезло – systemkern

+1

@systemkern - Извините, я этого не понимал. Даже если вы вызываете метод «через» подкласс (например, «SubClass.BaseClassStaticMethod();')), фактический код IL будет по-прежнему выглядеть так, как вы его вызывали из базового класса. Это просто синтаксический сахар от компилятора C#.Нет никакого способа, чтобы _actually_ вызвать метод «через подкласс» и, таким образом, никоим образом не изнутри метода выяснить, что вызывающий код C# был написан таким образом. –

+0

Да, это правда, но это может быть именно точка , вы можете иметь немного другое поведение, если вы вызываете SubClassAA.BaseClassStaticMethod(), чем если вы вызываете SubClassBB.BaseClassStaticMethod(). Это может быть не очень, но иногда необходимо, потому что у вас нет полного контроля над подклассом ... из-за «причин» – systemkern

44

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

  1. typeof(YourClass) - быстрая (0.043 микросекунд)

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

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


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

Смежные вопросы