C#获取自己的类名

时间:2010-01-21 21:30:26

标签: c# reflection

如果我有一个名为MyProgram的课程,有没有办法将“ MyProgram ”作为字符串检索?

12 个答案:

答案 0 :(得分:611)

试试这个:

this.GetType().Name

答案 1 :(得分:194)

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

typeof(MyProgram).Name

答案 2 :(得分:146)

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

nameof(MyProgram)

答案 3 :(得分:118)

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

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

答案 4 :(得分:14)

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

this.GetType().BaseType.Name

答案 5 :(得分:10)

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

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();
    }
}

答案 6 :(得分:8)

使用此

假设应用 Test.exe 正在运行, form1 中的功能 foo() [基本上它是类form1 < / em>],然后上面的代码将生成以下响应。

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 );

}

答案 7 :(得分:1)

获取Asp.net的当前类名

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

答案 8 :(得分:1)

MyProgram是一种类型,您可以这样做

typeof(MyProgram).Name

答案 9 :(得分:0)

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

GetType().Name

答案 10 :(得分:0)

这可以用于泛型类

typeof(T).Name

答案 11 :(得分:0)

最简单的方法是使用调用名称属性。但是,目前还没有返回调用方法的类名或命名空间的属性类。

见:CallerMemberNameAttributeClass

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output:
//  message: Something happened.
//  member name: DoProcessing
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs
//  source line number: 31