C# / VB.NET のコンパイラーである Roslyn はライブラリとして扱うこともでき、コード解析などを行うことができる。
その中でメソッドについての情報が格納されるのが IMethodSymbol だが、以下のような拡張メソッドの場合は、拡張メソッドそのものでは無く、展開した状態のメソッドが返される。
// SyntaxToken は外部依存 (Microsoft.CodeAnalysis) のもの
public static bool ToHaveHexadecimalLikeString(this SyntaxToken obj, string prefix = "_", string suffix = "")
{
// ...
}
IMethodSymbol symbol = ...;
symbol.Dump();
// Microsoft.CodeAnalysis.SyntaxToken.ToHaveHexadecimalLikeString(string, string)
書いている本人としては、 token.ToHaveHexadecimalLikeString() としているので、自然な表現ではあるのだが、展開したメソッドでは無く、実装しているメソッドそのものが欲しい場合は ReducedFrom を使うと得られる。
symbol.ReducedFrom.Dump(); // SyntaxTokenExtensions.ToHaveHexadecimalLikeString(Microsoft.CodeAnalysis.SyntaxToken, string, string)
ちなみに (おそらく) すべてがコンパイル対象に含まれている場合は、 ReducedFrom せずとも実装しているメソッドそのものが得られる。
というメモでした。