「特定の型がメソッドのパラメータに渡されているか調べる方法」の予想…

元ネタ:暗黙の ToString() メソッドの呼び出し元を、実行前に見つける方法は? - Insider .NET会議室
※タイトルに「予想」と付けたのは、実際に試してないからです。


コメントでは、FxCop を使ったら出来るかなと思ったんですが、試したところ難しそうだったので無理そうですねと書きました。
が、ToString の呼び出しだけじゃなくて、Foo 型のインスタンスがメソッドのパラメータとして渡されているのを見つけたいって事だと解釈すると、何とかなるんじゃないのかな?


FxCop では IL レベルでの解析が行えるので、Method の呼び出しだけではなく、Block(コードブロック) も検証することが出来ます。
てことは、Block を全部舐めていったら出来そうじゃない?
※ここからは、FxCop / IL をちゃんと勉強していないので推測が混じってます。
IL ではメソッドの呼び出しや、パラメータに渡す際には、ldloc 等の命令でスタックに積んでから call 等のメソッド呼び出し命令を実行するはずです。
てことは、Foo 型のインスタンスがスタックに積まれる且つ、Foo 型のメソッドの呼び出しでは無い時*1なら、FxCop で警告を出すとか。
加えて、メソッドの呼び出しのパラメータの型が Foo では無い場合(Object型を含む基底の型の場合)は、意図しない呼び出しとして扱う。
これで出来そうな気がしますが、FxCop でこれが全部出来るのかはわかりませんが…。

*1:ここらへんの判断がどうするのか微妙。最初にスタックに積まれたからといって、static なメソッドの呼び出しだったらパラメータになるし…。