2

可能重复:
使用反射调用重写的基方法

通常我可以从这样的重写方法中调用我的基类:

public override void Foo(Bar b)
{
    base.Foo(b);
}

如何通过反射进行同样的调用?

编辑:稍微解释一下,我正在尝试使用 AOP 来保护我的库的入口点免受未初始化操作的影响(在我的情况下,在库使用之前没有“初始化”调用)。因此,相关调用在技术上最终会在类中结束(借助 AOP),但预编译的代码将编写在单独的类中。换句话说,我希望将以下建议应用于我的所有入口点:

if (!initialized)
    return base.<method>(<arguments>);

我想使用反射调用重写的基本方法中显示的 IL 技巧对我有用 - 我只是希望在我的情况下有一些更干净的东西,因为它感觉更合法。

4

1 回答 1

2

编辑:好的,所以有点澄清;您不会尝试从任一类外部调用基类的实现。相反,您希望从被覆盖的类中反射性地调用父方法的实现。

... 为什么?您的对象静态地知道它是什么,因此静态地知道它的基类是什么。您不能有两个基类,也不能动态地将基类“分配”给预先存在的子类。

要回答你的问题,你不能。任何使用当前实例反射性调用“Foo”的尝试都将无限递归,因为 MethodInfo 的调用使方法调用就好像它来自外部(因为它是),因此运行时将遵循继承/覆盖行为. 您将不得不使用相关问题中的 IL hack。

于 2012-07-23T20:08:19.873 回答