C # получает свое собственное имя класса

464

Если у меня есть класс с именем MyProgram, есть ли способ получить « MyProgram » в виде строки?

deltanovember
источник

Ответы:

743

Попробуй это:

this.GetType().Name
micahtan
источник
36
Если вы используете статический метод, то разработчик знает, как называется тип. Вы можете просто ввести его как строку в исходном коде.
Эрик Липперт
122
@EricLippert: если вы введете имя, компилятор не поймает его, если класс будет переименован.
Halvard
12
@Halvard: во-первых, если статический метод относится к текущему типу, тогда имя необязательно; если вы беспокоитесь о том, что это изменится, опустите его. Во-вторых, Visual Studio автоматически выдаст вам смарт-тег при переименовании класса, который переименует все его экземпляры. И в-третьих, если вы переименовываете класс, то шансы хороши, вам придется внести много изменений во многих местах.
Эрик Липперт,
12
@EricLippert Вы правы. Любая новая версия Visual Studio или ReSharper будет перехватывать строки с тем же именем, что и переименованный класс. Мой предыдущий комментарий - это просто старые, теперь бесполезные знания ...
Халвард
17
@Halvard: ... а в C # 6 вы можете использовать новый nameofоператор.
Эрик Липперт
238

Я хотел бросить это для хорошей меры. Я думаю, что способ размещения @micahtan является предпочтительным.

typeof(MyProgram).Name
ChaosPandion
источник
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)
Cyanfish
источник
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
mikeschuld
источник
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();
    }
}
bafsar
источник
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 );

}
Харшал Доши Джайн
источник
Декларируемый тип объявлен, [Nullable(2)]поэтому вы получаете предупреждение, когда проверка нуля активна.
Мартин
@ Мартин, пожалуйста, объясни свой комментарий. Я не понимаю?
NoChance
2

thisможет быть опущено Все, что вам нужно, чтобы получить имя текущего класса:

GetType().Name
Микаэль Энгвер
источник
2

Получить Текущее имя класса Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();
Аббас Али
источник
1
Декларируемый тип объявлен, [Nullable(2)]поэтому вы получаете предупреждение, когда проверка нуля активна.
Мартин