【问题标题】:how to get all previous called methods from first to end methods如何从 first 到 end 方法获取所有先前调用的方法
【发布时间】:2021-11-27 07:20:18
【问题描述】:

假设我们有这段代码

namespace app.Entities
{
    public class school
    {
        public bool Addschool() { }
    }
}


namespace app.layer1
{
    public class ManageSchool
    {
        public bool schoolInfo() {
            schoolInfo.addSchool();
        }
    }
}


namespace app.layer
{
    public class schoolAPi
    {
        public bool GetAndAdd()
        {
            ManageSchool.schoolInfo();
        }
    }
}

我想知道 app.entitied 命名空间中哪些层和函数调用了 AddSchool() 方法 对于 exp : app.layer2.schoolAPi.GetAndAdd >> app.layer1.ManageSchool.schoolInfo >> app.Entities.school.Addschool

【问题讨论】:

  • 你可以使用System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace();
  • 能否请您严格遵守命名约定?在 C# 中,我们将 PascalCase 用于命名空间、类、方法和属性。 camelCase 通常适用于私人和本地成员

标签: c# .net function reflection stack-trace


【解决方案1】:

尝试查看System.Diagnostics.StackTraceSystem.Diagnostics.StackFrame 类。 您可以使用Trace 方法创建一些Tracer 类来跟踪每个调用,但您应该将跟踪放在每个方法中以便能够跟踪它。

Tracer.cs 的示例:

using System.Diagnostics;

public class Tracer
{
    public static void Trace()
    {
        StackFrame sf = new StackTrace(true).GetFrame(1);
        Console.WriteLine("Called {0} in {1} at line: {2}", sf.GetMethod().ToString(), sf.GetFileName(), sf.GetFileLineNumber());
    }
}

您的项目示例:

Entities.cs:

namespace App.Entities
{
    public class School
    {
        public static bool AddSchool()
        {
            Tracer.Trace();
            return true;
        }
    }
}

LayerOne.cs:

using App.Entities;

namespace App.LayerOne
{
    public class ManageSchool
    {
        public static bool SchoolInfo()
        {            
            Tracer.Trace();
            School.AddSchool();
            return true;
        }
    }
}

LayerTwo.cs:

using App.LayerOne;

namespace App.LayerTwo
{
    public class SchoolAPI
    {
        public static bool GetAndAdd()
        {
            Tracer.Trace();
            ManageSchool.SchoolInfo();
            return true;
        }
    }
}

还有一个Program.cs

using System;
using App.LayerTwo;

namespace App
{
    class Program
    {
        static void Main(string[] args)
        {   
            Tracer.Trace();
            SchoolMethod();
            Console.ReadKey();
        }

        static void SchoolMethod()
        {
            Tracer.Trace();
            SchoolAPI.GetAndAdd();                
        } 
    }
}

它会给你一些这样的结果:

您也可以将Tracer.Trace() 方法置于某些全局设置的布尔条件下,仅在需要跟踪时使用:

if (MySettingsClass.TraceEnabled)
    Tracer.Trace();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多