いいえ、反射/IL 検査を使用しています。これが静的コード分析です。型の特定のランタイム インスタンスでは何もしていません。
ポリモーフィズムは実行時に「評価」されます。実行時は、(オブジェクトの実際の型に基づいて) 呼び出す仮想メソッドのバージョン (ベースまたは派生) を決定します。
あなたのコードは特定の型でメソッドを検索しているように見えます。これは、メタデータをそのまま検査しているため、定義によりその型からメソッドを返します (基本は基本メソッドを宣言し、派生は派生メソッドを宣言し、空想的なものは何もありません; それは単なる事実です)。
(IIRC) Mono.Cecil (JbEvain から) は MethodDefinition で Overloads コレクションを公開していると思います。MethodDefinition を取得するには、MethodReference.Resolve() を呼び出す必要があると思います。
必要に応じて、より多くの背景:
callvirt
CIL で実行するときに適用されるランタイム ルールに従って、仮想メソッドを呼び出す安全なリフレクション方法はありません。つまり、あなたがそうしても:
class BaseClass
{ public virtual void SomeMethod() {} }
class Derived :BaseClass {}
class MainClass
{
public static void Main (string[] args)
{
Expression<Action<Derived>> expr = (instance) => instance.SomeMethod();
var method = (expr.Body as MethodCallExpression).Method;
Console.WriteLine(method.DeclaringType);
}
}
NamespaceName.BaseClass
仮想を宣言するクラスであるため、出力されます。