2012-07-23 71 views
2

可能重复:
Use reflection to invoke an overridden base method如何通过反射调用基类的方法?

通常情况下,我可以叫我的基类,覆盖方法中是这样的:

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

我怎样才能让这个相同的调用反射?

编辑:解释一下,我试图用AOP来防止我的库的入口点从未初始化的操作(在我的情况下,在库的使用之前没有“初始化”调用)。所以相关的调用将在技术上结束(通过AOP),但预编译的代码将写入一个单独的类中。换句话说,我希望下面的建议适用于所有的我的切入点:

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

我想在Use reflection to invoke an overridden base method所示的IL把戏,对我的工作 - 我只是希望有什么东西在我的情况更清洁,因为它感觉更合理。

+0

@HatSoft:看到了,但我认为它有点不同。他试图从课堂外调用基类的重写方法。 – ladenedge 2012-07-23 20:08:40

+0

所以你想反射性地从派生实例的内部代码中调用父方法?你为什么认为你需要这样做? – KeithS 2012-07-23 20:11:34

+0

你真的真的不想让AOP注入反射调用到所有的方法中......除非你正在与其他人竞争,以查看谁可以创建最慢的程序 – 2012-07-23 20:28:17

回答

2

编辑:好的,这么说明一点;你不想从任何一个类的外部调用基类的实现。相反,从重写的类中,您想反射性地调用父方法的实现。

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

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

+0

啊,有趣的递归点。这是美中不足之处。 – ladenedge 2012-07-23 20:26:47

+0

显然这是[不可能通过一些PostSharp技巧]无论是哪一个都是不可能的(http://support.sharpcrafters.com/discussions/questions/20-call-an-overridden-base-classs-method-in-postsharp-aspect)。啊,谢谢你的帮助! – ladenedge 2012-07-23 20:52:22

相关问题