模块类的解决方法在重写的方法上混乱了

|| 我有一个派生类,其方法重写了基类的方法(像这样),但是
module.ResolveMethod(token, typeArguments, methodArguments)
给我一个MethodBase,它的基本类型为declaringType,而不是派生类型。 这是
module.ResolveMethod
中的错误吗? 代码发布起来相当复杂,但是我使用的是Jb Evain的MethodBaseRocks     
已邀请:
不,您正在使用反射/ IL检查。这是静态代码分析。您没有在类型的特定运行时实例上执行任何操作。 多态性在运行时被“评估”:运行时(基于对象的实际类型)决定要调用哪个虚拟方法版本(基础或派生)。 您的代码似乎在特定类型上查找方法,根据定义,该方法将返回该类型的方法,因为您正在按原样检查元数据(基本声明基本方法,派生声明派生方法,没什么特别的;这只是事实)。 我认为(IIRC)Mono.Cecil(来自JbEvain)在MethodDefinition上公开了Overloads集合。我想您可能必须调用MethodReference.Resolve()才能获得MethodDefinition。 如果需要更多背景: 没有安全的反射方式可以根据在CIL中执行“ 2”时适用的运行时规则来调用虚拟方法。即即使您这样做:
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);
    }
}
它会显示“ 4”,因为它是声明虚拟的类。     

要回复问题请先登录注册