Callstack.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Diagnostics;
  3. using System.Globalization;
  4. using System.Reflection;
  5. namespace WinSCP
  6. {
  7. internal class Callstack : IDisposable
  8. {
  9. public Callstack(Logger logger)
  10. {
  11. _logger = logger;
  12. if (_logger.Logging)
  13. {
  14. Type type = GetType();
  15. StackTrace stackTrace = new StackTrace();
  16. int i = 0;
  17. MethodBase method;
  18. do
  19. {
  20. StackFrame frame = stackTrace.GetFrame(i);
  21. method = frame.GetMethod();
  22. if ((method.IsConstructor && method.DeclaringType.IsAssignableFrom(type)) ||
  23. ((method.MemberType == MemberTypes.Method) && ((MethodInfo)method).ReturnType.IsAssignableFrom(type)))
  24. {
  25. method = null;
  26. }
  27. else
  28. {
  29. break;
  30. }
  31. i++;
  32. }
  33. while (i < stackTrace.FrameCount);
  34. if (method != null)
  35. {
  36. _name = string.Format(CultureInfo.InvariantCulture, "{0}.{1}", method.DeclaringType.Name, method.Name);
  37. _logger.WriteLine("{0} entering", _name);
  38. _logger.Indent();
  39. }
  40. }
  41. }
  42. public virtual void Dispose()
  43. {
  44. if (_name != null)
  45. {
  46. _logger.Unindent();
  47. _logger.WriteLine("{0} leaving", _name);
  48. }
  49. }
  50. private readonly Logger _logger;
  51. private readonly string _name;
  52. }
  53. }