Get run time type of stack frames

后端 未结 2 1483
夕颜
夕颜 2021-01-14 12:04

I was wondering if it were possible to obtain the run time type of method callers in the stack trace.

Consider the following example:

class Parent
{
         


        
相关标签:
2条回答
  • 2021-01-14 12:07

    You are calling Parent.Foo(), that's why you are getting Parent type.

    One way would be create a method in Child:

    class Parent
    {
    }
    
    class Child : Parent
    {
        public void Foo()
        {
            var stack = new StackTrace();
            foreach (var frame in stack.GetFrames())
            {
                var methodInfo = frame.GetMethod();
                Console.WriteLine("{0} (ReflectedType: {1})", methodInfo.ToString(), methodInfo.DeclaringType);
            }
        }
    }
    

    Proof.

    But what I can think is the usage. Where do you plan to get that info about stack, types, methods? More likely in some logger. And then you don't really need to know is it Parent.Foo() or Child.Foo(), because you (as programmer) know for sure where Foo() is.

    Other thing is what it may be enough (for logger) to only know caller, then it's as simple as

    public static void Log(string message, Exception exception = null)
    {
        var method = new StackFrame(1).GetMethod();
        // get caller name, so that you don't need to specify it, when calling Log()
        var caller = method.DeclaringType.Name + "." + method.Name;
        ...
    }
    
    0 讨论(0)
  • 2021-01-14 12:19

    No. The reason is described by Raymond Chen here.

    The relevant quote is:

    An object in a block of code can become eligible for collection during execution of a function it called.

    It's not intuitive, read the part about JIT and GC working together.

    Getting the actual Type requires the instance, but the optimization effort is geared toward making that Garbage, so you can't rely on it still being there.

    0 讨论(0)
提交回复
热议问题