C # отримання власної назви класу


464

Якщо у мене є клас, який називається MyProgram, чи існує спосіб отримання " MyProgram " у вигляді рядка?

Відповіді:


743

Спробуйте це:

this.GetType().Name

36
Якщо ви користуєтеся статичним методом, розробник знає, як називається тип. Ви можете просто ввести його як рядок у вихідному коді.
Ерік Ліпперт

122
@EricLippert: Якщо ви введете ім'я, компілятор не впіймає його, якщо клас буде перейменований.
Халвард

12
@Halvard: По-перше, якщо статичний метод є у поточному типі, то ім'я не є обов'язковим; якщо ви переживаєте, як це зміниться, опустіть це. По-друге, Visual Studio автоматично надасть вам розумний тег при перейменуванні класу, який перейменовує всі його екземпляри. По-третє, якщо ви перейменовуєте клас, тоді шанси хороші, вам доведеться вже багато змін змінити в багатьох місцях.
Ерік Ліпперт

12
@EricLippert Ви праві. Будь-яка нова версія Visual Studio або ReSharper буде містити рядки з тим самим назвою, що і клас перейменований. Мій попередній коментар - це лише старе, тепер марне знання ...
Халвард

17
@Halvard: ... і в C # 6 ви можете використовувати нового nameofоператора.
Ерік Ліпперт

238

Я хотів підкинути це на добру міру. Я думаю, що спосіб @micahtan опублікований є кращим.

typeof(MyProgram).Name

24
Це насправді краще, тому що: 1. Він буде працювати в статичному контексті 2. Він обчислюється часом компіляції, тому це не коштує як рефлексія
Гілберт

6
@JimBalter Він має ряд переваг: 1. Статичний контекст. 2. Частина типу не буде повторно оцінюватися CLR кожен раз - вона буде записана в MSIL. 3. Це захищає вас від того, щоб хтось оголосив новий "GetType ()".
Гілберт

11
Якщо ви хочете отримати успадковане ім'я класу, і цей виклик знаходиться у батьківському, то він не працюватиме.
Gh61

10
Це має недолік у тому, щоб чітко посилатися на тип, що робить його менш легким для повторного використання.
cprcrack

20
У C # 6.0 або новіших версіях ви можете це зробити nameof(MyProgram).
Оуен Джонсон

190

З C # 6.0 ви можете використовувати nameofоператор:

nameof(MyProgram)

4
Чудові речі; також працює з членами типу (наприклад, методами та властивостями) і навіть зі змінними - дивіться документи .
mklement0

127

Хоча відповідь Міхетана хороша, статичним методом це не вийде. Якщо ви хочете отримати ім'я поточного типу, це повинно працювати всюди:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

2
Хороший улов, хоча я вважаю, що мій метод є кращим у цьому випадку.
ChaosPandion

5
Це не працюватиме для невіртуальних методів, оскільки воно поверне ім'я типу, у якому заявлений і реалізований метод (можливо, в ланцюжку успадкування), а не конкретний тип екземпляра, яким ви фактично виконуєте код з.
Чарльз Бретана

1
Схоже, це більше не працює в рамках DNX (Dot Net Execution). Вони видалили метод GetCurrentMethod () і залишили лише GetMethodFromHandle ().
Астаар

Це саме те, що мені потрібно було отримати ім'я конкретного класу, який зараз виконує код, викликаний з віртуальної функції в нащадку.
DrFloyd5

15

Для довідки, якщо у вас є тип, який успадковується від іншого, ви також можете використовувати

this.GetType().BaseType.Name

12

Якщо вам це потрібно у похідних класах, ви можете помістити цей код у базовий клас:

protected string GetThisClassName() { return this.GetType().Name; }

Потім ви можете дійти до імені у похідному класі. Повертає похідне ім'я класу. Звичайно, при використанні нового ключового слова "nameof" не буде потреби, як це різноманітність.

Крім того, ви можете визначити це:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

А потім використовуйте так:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}

10

Використовуй це

Скажімо, Application Test.exe працює і функція foo () у form1 [в основному це клас form1 ], тоді вище код буде генерувати нижче відповіді.

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

Це повернеться.

s1 = "TEST.form1"

для назви функції:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

повернеться

s1 = foo 

Зверніть увагу, якщо ви хочете використовувати це за винятком використання:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringType оголошується, [Nullable(2)]щоб ви отримували попередження, коли активізовано перевірку нуля.
Мартін

@Martin, будь ласка, поясніть ваш коментар. Я не розумію?
NoChance

2

thisможна опустити. Все, що вам потрібно, щоб отримати назву поточного класу, це:

GetType().Name

2

Отримати назву поточного класу Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();

1
DeclaringType оголошується, [Nullable(2)]щоб ви отримували попередження, коли активізовано перевірку нуля.
Мартін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.