c# - 子类中虚方法的序列图

标签 c# types sequence-diagram

我正在使用一个 C# API,它具有相当复杂的虚方法调用顺序,可以在类型层次结构的各个级别中被覆盖。我希望能够记录这些方法的执行顺序,我想知道是否有一种方法可以做到这一点而不必在类中添加 Trace 写入。鉴于这些类中的每一个都有超过 2k LOC,手动完成这将是一项非常艰巨的任务!

让我尝试给出一个常见方法流程的快速示例:

public class Base
{
    protected void Init()
    {
        this.BeginInitInternal();
        this.OnInit();
        this.AfterInitInternal();
    }

    protected virtual void AfterInitInternal() { }
    protected virtual void OnInit() { }
    protected virtual void BeginInitInternal() { }
}

public class Derived : Base
{
    protected sealed override void BeginInitInternal()
    {
        // Logic here
        this.BeginInit();
    }

    protected sealed override void AfterInitInternal()
    {
        // Logic here
        this.AfterInit();
    }

    protected virtual void BeginInit() { }
    protected virtual void AfterInit() { }
}

public class Concrete : Derived
{
    protected override void BeginInit() { /* Logic here */ }
    protected override void OnInit() { /* Logic here */ }
    protected override void AfterInit() { /* Logic here */ }
}

Concrete 实现是由 API 的使用者创建的,我希望能够通知他/她所有这些调用的顺序(理想情况下还有上下文,但那是不在问题范围内。

我不一定需要 UML 序列图,但这是我发现的最接近我正在寻找的模拟。

理想情况下,我希望它告诉工具查看 DerivedBase.Init() 的实现并发出如下内容:

  1. Derived.BeginInit()
  2. Base.OnInit()
  3. Derived.AfterInit()

我已经试用了 VS 序列图生成器,但我似乎无法告诉它使用 Concrete 而是从 Base.Init() 开始。我也尝试过使用 VS Code Map,但它阻碍了解决方案的复杂性并且通常会出错。最后,我尝试使用 NDepend,它很接近 - 它可以告诉我所有调用,但不能告诉我它们的顺序。

还有什么我可以尝试的吗,或者我应该开始到处粘贴 Trace.WriteLines 吗?

最佳答案

哦。这是使用 Roslyn 的好案例。

如果你想从你的源代码中提取自定义信息,那是依赖于那个源代码,而不是让源代码适应你的读者;我会说这是使用 Roslyn 的有力案例。

http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx

关于c# - 子类中虚方法的序列图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13973803/

相关文章:

c# - WPF RoutedEventHandler 不适用于内容

C# Unity 角色跳跃真的很奇怪

data-structures - Haskell 的代数数据类型

python - 如何在python中另一个类的函数中获取调用者类名?

sequence-diagram - 使用快速序列图编辑器制作序列图

c# - 如何从控制台读取用户输入?

c# - Microsoft.VisualStudio.TestTools.UnitTesting.Assert 泛型方法重载行为

c - 在 C 中解析 csv 文件时 double 丢失

methods - 您可以在 clojure defrecord 中指定方法的返回类型吗?

uml - 表示在序列图中相互调用的两个对象