C#获取自己的类名

del*_*ber 422 c# reflection

如果我有一个被调用的类MyProgram,有没有办法将" MyProgram " 检索为字符串?

mic*_*tan 677

试试这个:

this.GetType().Name
Run Code Online (Sandbox Code Playgroud)

  • @EricLippert:如果输入名称,如果重命名该类,编译器将不会捕获它. (102认同)
  • 如果您使用的是静态方法,则*developer*会知道该类型的名称.您只需在源代码中以字符串形式输入即可. (34认同)
  • @Halvard:......在C#6中,您可以使用新的`nameof`运算符. (15认同)
  • @Halvard:首先,如果静态方法是当前类型,那么名称是可选的; 如果你担心它会改变,请省略它.其次,当您重命名重命名其所有实例的类时,Visual Studio将自动为您提供智能标记.第三,如果你重新命名一个课程,那么你很可能已经在许多地方做了很多改变. (12认同)
  • @EricLippert你是对的.Visual Studio或ReSharper的任何***新***版本将捕获与重命名的类同名的字符串.我以前的评论只是一些旧的,现在没用的知识...... (12认同)
  • @EricLippert我想要检测我所在的类(甚至方法)名称的原因是出于日志记录目的-我猜我可以写stacktrace,但似乎太冗长了。如果我想写一些东西要记录,并且让该记录在WriteLine的开头自动包含“ MyNamespace.FooClass.BarMethod”,那么有什么好方法吗? (2认同)
  • 你也可以做`typeof(ThisClass).Name` (2认同)
  • @ Bennik2000 - 如果是继承类,您的建议会给出基类的名称! (2认同)
  • @Konstantin,1)我的评论是对Bennik2000的回应,Bennik2000似乎是对一个不提静态问题的答案的评论,我的评论仍然有效.2)在类中你总是可以做nameof()而不管它是静态的还是实例:https://dotnetfiddle.net/y9XzEB (2认同)

Cha*_*ion 213

我想把它放在一边好好衡量.我认为@micahtan发布的方式是首选.

typeof(MyProgram).Name
Run Code Online (Sandbox Code Playgroud)

  • 这实际上更好,因为:1.它将在静态上下文中工作2.它是计算的编译时间,因此它不像反射那样 (21认同)
  • 在C#6.0或更高版本中,您可以执行`nameof(MyProgram)`. (18认同)
  • 如果你想获得继承的类名,并且这个调用在父类中,那么它将无法工作. (10认同)
  • 这样做的缺点是必须明确引用类型,这使得它不易重复使用. (9认同)
  • @JimBalter它有多个优点:1.静态上下文.2.每次CLR都不会重新评估类型部分 - 它将被写入MSIL.3.它可以保护您免受声称新"GetType()"的人的侵害. (6认同)
  • @Gilbert这并不比micatan接受的答案更好,无论类的名称如何,它都有效。与简单的“MyProgram”相比,它的唯一优点是,如果类名发生更改,编译器将捕获它。 (2认同)
  • @JimBalter正确,相对于“MyProgram”的优点是,如果类名发生更改或者第一次出错,编译器会捕获它。 (2认同)

Cya*_*ish 166

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

nameof(MyProgram)
Run Code Online (Sandbox Code Playgroud)

  • 好东西; 也适用于类型_members_(如方法和属性)甚至变量 - 请参阅[文档](https://msdn.microsoft.com/en-us/library/dn986596.aspx?f=255&MSPPError=-2147217396). (4认同)

Tho*_*que 120

虽然micahtan的答案很好,但它不适用于静态方法.如果要检索当前类型的名称,那么这个名称应该可以在任何地方使用:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于非虚方法,因为它将返回声明和实现该方法的类型的名称(可能是继承链),而不是实际执行代码的实例的具体类型从. (4认同)
  • 很好的捕获,虽然我认为我的方法在这种情况下是首选. (2认同)
  • 这在 DNX(Dot Net Execution)框架中似乎不再起作用。他们删除了 GetCurrentMethod() 方法,只留下 GetMethodFromHandle()。 (2认同)

mik*_*uld 15

作为参考,如果您有一个继承自另一个的类型,您也可以使用

this.GetType().BaseType.Name
Run Code Online (Sandbox Code Playgroud)


baf*_*sar 11

如果在派生类中需要它,可以将该代码放在基类中:

protected string GetThisClassName() { return this.GetType().Name; }
Run Code Online (Sandbox Code Playgroud)

然后,您可以在派生类中找到该名称.返回派生类名.当然,当使用新关键字"nameof"时,不需要像这种多样的行为.

除此之外你可以定义:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ver 10

this可以省略。获取当前类名所需要做的就是:

GetType().Name
Run Code Online (Sandbox Code Playgroud)


Har*_*ain 9

用这个

让说应用将Test.exe正在运行,并且功能是FOO()在Form1中 [基本上它是Form1类 ],然后上面的代码会产生下面的反应.

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;
Run Code Online (Sandbox Code Playgroud)

这将返回.

s1 = "TEST.form1"
Run Code Online (Sandbox Code Playgroud)

功能名称:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;
Run Code Online (Sandbox Code Playgroud)

将返回

s1 = foo 
Run Code Online (Sandbox Code Playgroud)

请注意,如果要在异常使用中使用它:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}
Run Code Online (Sandbox Code Playgroud)