1

この質問の内容は複雑すぎてここで説明できず、回答に悪影響を与える可能性があるため、含めません。単体テストのメソッドについて特定のことを主張したい。これらのいくつかは、try/finallyブロックのフォーマット、クラス フィールド、メソッド ローカル変数などのリフレクションを使用して可能です。型とメソッド シグネチャは既に知っています。

    protected override void OnTest ()
    {
        bool result = false;
        SomeCOMObject com = null; // System.__ComObject

        try
        {
        }
        finally
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(com);
        }

        return (result);
    }

私が達成できなかったのは、次のようなものです。

  • メソッドに単一のreturn (result);ステートメントのみが含まれているかどうか、およびそのステートメントが関数の最後のステートメントであるかどうか。
  • タイプのすべての変数が、ブロックでSystem.__ComObject使用して手動で逆参照されているかどうか。System.Runtime.InteropServices.Marshal.ReleaseComObject(object)finally

これらのいくつかはリフレクションでは不可能であり、ソース コードのテキスト分析は理想からかけ離れているため、CodeDom に目を向けましたが、それを把握することはできませんでした。ソース コードから式ツリーを作成することはできないと言われました。また、ランタイム型から式ツリーを作成することもできません。それが正しい場合、CodeDom を活用して上記のリストを達成するにはどうすればよいですか?

私は以前、コード生成と単純なコード クラスのアセンブリへのコンパイルに CodeDom を使用しました。しかし、メソッドの内部を分析するためにどのように使用できるかわかりません。お知らせ下さい。

4

1 に答える 1

2

一般に、プログラミング言語に組み込まれたリフレクションでは、関数の内容にアクセスできません。したがって、リフレクションではこれを行うことはほとんどできません。

同等のバイトコードにアクセスできる場合はできるかもしれませんが、バイトコードはメソッドの構文に関する質問に実際には答えられません。たとえば、「同じ式を返す return ステートメントがいくつ存在するか」などです。

コードについて推論したい場合は、ソースコードについて推論する必要があります。これは、パーサーにアクセスする必要があることを意味し、多くの場合、他の有用な事実 (「X の宣言は何ですか?」、「X と Y の型は互換性がありますか?」、「データは X から Y に流れますか?」) などにアクセスする必要があります。

Roslyn は、この情報の一部を提供します。商用ソリューションもあります(私は持っています)。

于 2013-05-13T17:46:31.740 に答える