3

私は、型階層のさまざまなレベルでオーバーライドできる仮想メソッド呼び出しのかなり複雑な順序を持つ C# API を使用しています。これらのメソッドの実行順序を文書化できるようにしたいのですが、Trace 書き込みをクラスに追加することなくそれを行う方法があるかどうか疑問に思っています。これらの各クラスの LOC が 2,000 を超えることを考えると、手動で行うのは非常に途方もない作業になります。

一般的なメソッド フローの簡単な例を挙げてみましょう。

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 */ }
}

実装は API の消費者によって作成されます。Concrete私は、これらすべての呼び出しの順序を彼/彼女に通知できるようにしたいと考えています (理想的にはコンテキストもですが、それは質問の範囲外です。

UML シーケンス図は必ずしも必要ではありませんが、探しているものに最も近いものを見つけました。

Base.Init()理想的には、 onの実装を見て、次のようなものを発行するようにツールに指示したいと思いますDerived

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

VSシーケンス図ジェネレーターを試してみましたが、使用するように指示することはできませんがConcreteBase.Init(). 私も VS Code Map を使用してみましたが、ソリューションの複雑さで窒息し、通常はエラーになります。最後に、NDepend を使用してみました。これは、すべての呼び出しを教えてくれますが、それらの順序は教えてくれません。

他に試すことができるものはありますか、それともどこにでも貼り付けることから始めるべきTrace.WriteLinesですか?

4

2 に答える 2

1

おー。これは、Roslynを使用する場合に適しています。

ソースをリーダーに適合させることなく、ソースコードからカスタム情報を抽出する場合は、そのソースコードに依存します。これはRoslynを使用するための強力なケースだと思います。

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

于 2013-01-20T19:56:37.903 に答える
0

You can consider intercepting calls to each method and can do whatever out of the box like logging, creating document etc.

You can see here how we can intercept calls of methods.

http://dotnetdlr.com/2011/05/06/intercept-calls-to-objects-in-c/

于 2013-01-22T04:13:57.650 に答える