C#获得自己的类名


464

如果我有一个名为的类MyProgram,是否可以将“ MyProgram ” 检索为字符串?

Answers:


743

尝试这个:

this.GetType().Name

36
如果您使用的是静态方法,则开发人员将知道类型的名称。您可以在源代码中将其作为字符串键入。
埃里克·利珀特

122
@EricLippert:如果输入名称,则在重命名该类时,编译器将不会捕获该名称。
哈佛大学

12
@Halvard:首先,如果静态方法为当前类型,则名称为可选;如果您担心它会发生变化,请忽略它。其次,当您重命名重命名所有实例的类时,Visual Studio会自动为您提供智能标记。第三,如果您要重命名课程,那么赔率很好,您将不得不在很多地方进行很多更改。
埃里克·利珀特

12
@EricLippert你是对的。任何版本的Visual Studio或ReSharper都将捕获与重命名的类同名的字符串。我以前的评论只是一些古老的,现在无用的知识……
哈佛

17
@Halvard:...并且在C#6中,您可以使用new nameof运算符。
埃里克·利珀特

238

我想把这个丢掉,以防万一。我认为@micahtan发布的方式是首选。

typeof(MyProgram).Name

24
这实际上是更好的,因为:1.它可以在静态上下文中工作2.它是在编译时计算的,因此它不会像反射那样花费
Gilbert

6
@JimBalter它具有多个优点:1.静态上下文。2.类型部分不会被CLR每次重新评估-它将被写入MSIL。3.它可以保护您免受声明新的“ GetType()”的人的侵害。
吉尔伯特

11
如果要获取继承的类名,并且此调用位于父类中,则它将无法正常工作。
2014年

10
这具有必须显式引用类型的缺点,这使得它不太容易重用。
cprcrack 2015年

20
在C#6.0或更高版本中,您可以这样做nameof(MyProgram)
欧文·约翰逊

190

在C#6.0中,可以使用nameof运算符:

nameof(MyProgram)

4
好东西; 还可以与类型成员(例如方法和属性)甚至变量一起使用-请参阅docs
mklement0

127

尽管米卡丹的回答是好的,但它不能以静态方法工作。如果要检索当前类型的名称,则该名称应可在任何地方使用:

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

2
不错,尽管我认为在这种情况下首选我的方法。
ChaosPandion 2010年

5
这不适用于非虚拟方法,因为它将返回声明和实现该方法的类型的名称(可能在继承链中),而不是您实际执行代码的实例的具体类型从。
Charles Bretana

1
在DNX(点网执行)框架中,这似乎不再起作用。他们删除了GetCurrentMethod()方法,只剩下GetMethodFromHandle()。
阿斯塔尔2015年

这正是我需要获得当前正在执行的,从后代中的虚函数调用的代码的具体类的名称。
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正在运行,并且函数在form1中foo() [基本上是类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)]以便在启用null检查时收到警告。
马丁,

@马丁,请解释您的评论。我不明白吗?
NoChance


2

获取Asp.net的当前类名称

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

1
声明了DeclaringType,[Nullable(2)]以便在启用null检查时收到警告。
马丁,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.