1

基本クラスのメソッドをオーバーライドするメソッドを持つ派生クラスがありますが (このように)module.ResolveMethod(token, typeArguments, methodArguments)、本来あるべき派生型ではなく、基本型の declaringType を持つ MethodBase を提供します。

これは のバグmodule.ResolveMethodですか?

コードを投稿するにはかなり複雑ですが、私はJb Evain の MethodBaseRocksを使用しています。

4

1 に答える 1

1

いいえ、反射/IL 検査を使用しています。これが静的コード分析です。型の特定のランタイム インスタンスでは何もしていません。

ポリモーフィズムは実行時に「評価」されます。実行時は、(オブジェクトの実際の型に基づいて) 呼び出す仮想メソッドのバージョン (ベースまたは派生) を決定します。

あなたのコードは特定の型でメソッドを検索しているように見えます。これは、メタデータをそのまま検査しているため、定義によりその型からメソッドを返します (基本は基本メソッドを宣言し、派生は派生メソッドを宣言し、空想的なものは何もありません; それは単なる事実です)。

(IIRC) Mono.Cecil (JbEvain から) は MethodDefinition で Overloads コレクションを公開していると思います。MethodDefinition を取得するには、MethodReference.Resolve() を呼び出す必要があると思います。


必要に応じて、より多くの背景:

callvirtCIL で実行するときに適用されるランタイム ルールに従って、仮想メソッドを呼び出す安全なリフレクション方法はありません。つまり、あなたがそうしても:

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仮想を宣言するクラスであるため、出力されます。

于 2011-04-14T20:24:17.960 に答える