c# print the class name from within a static funct

2019-03-17 09:39发布

问题:

Is it possible to print the class name from within a static function?

e.g ...

public class foo
{

    static void printName()
    {
        // Print the class name e.g. foo
    }

}

回答1:

You have three options to get the type (and therefore the name) of YourClass that work in a static function:

  1. typeof(YourClass) - fast (0.043 microseconds)

  2. MethodBase.GetCurrentMethod().DeclaringType - slow (2.3 microseconds)

  3. new StackFrame().GetMethod().DeclaringType - slowest (17.2 microseconds)


If using typeof(YourClass) is not desirable, then MethodBase.GetCurrentMethod().DeclaringType is definitely the best option.



回答2:

Console.WriteLine(new StackFrame().GetMethod().DeclaringType);


回答3:

While the StackTrace answers are correct, they do have an overhead. If you simply want safety against changing the name, consider typeof(foo).Name. Since static methods can't be virtual, this should usually be fine.



回答4:

A (cleaner, IMO) alternative (still slow as hell and I would cringe if I saw this in a production code base):

Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType);

By the way, if you're doing this for logging, some logging frameworks (such as log4net) have the ability built in. And yes, they warn you in the docs that it's a potential performance nightmare.



回答5:

StackTrace class can do that.



回答6:

Since C# 6.0 there exists an even simpler and faster way to get a type name as a string without typing a string literal in your code, using the nameof keyword:

public class Foo
{
    static void PrintName()
    {
        string className = nameof(Foo);
        ...
    }
}


回答7:

Since static methods cannot be inherited the class name will be known to you when you write the method. Why not just hardcode it?



标签: c# static