Get run time type of stack frames

后端 未结 2 1486
夕颜
夕颜 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;
        ...
    }
    

提交回复
热议问题