![]() |
1
17
您看到GetType调用是因为在第2步中,C#运行时绑定器正在向您反映,试图找出是否有一个适合调用的“World”方法,这是因为hello的IDynamicMetaObjectProvider实现(如果有的话)无法提供任何特殊的操作。 不幸的是,在抛出RuntimeBinderException时,我们不再绑定。异常来自动态操作的执行阶段,响应于步骤3返回的元对象。你唯一的机会是在实际的通话地点。 所以,如果您想要实现C中缺少的方法,那么这个策略就不适合您。不过你有一些选择。 一个简单的选择是在MethodMissingInterceptor中实现IDynamicMetaObjectProvider,并遵从包装对象的IDMOP实现。如果内部IDMOP出现故障,您可以绑定到您想要的任何对象(可能是对拦截器中存储的缺少委托的方法的调用)。这里的缺点是,这只适用于已知为动态对象的对象,例如那些首先实现IDMOP的对象。这是因为您基本上是在第1步和第2步之间插入自己。 我能想到的另一种选择是实现IDynamicMetaObjectProvider,并在其中积极响应每个绑定,返回对一个方法的调用,该方法(a)生成与C#编译器将首先生成的绑定代码相同的代码,(b)捕获RuntimeBinderException以调用一个方法#missing方法。这里的缺点是它会非常复杂——您需要生成任意委托类型和使用它们的IL,而C#runtime binder程序集中的公共类型坦率地说,并不用于公共消费。但至少在所有操作中都会缺少方法。 我相信我还没有想到其他一些策略,比如你似乎暗示要使用远程代理。我无法想象他们是什么样子,我也不能说他们是否会成功。 这里问题的症结在于C#4.0没有一个能够预见到您希望这样做的设计。具体来说,您无法轻松地将自己插入步骤2和步骤3之间。这让我想到了一个简短的答案,很抱歉,C#4.0没有缺少方法#。 |
![]() |
Pedro Henrique · 如何为自己分配代理陷阱? 9 月前 |
![]() |
Kwang Sing · 在chrome扩展中为请求添加前缀的正确设置是什么? 10 月前 |
![]() |
devops-admin · 如何将Nginx配置为转发代理服务器? 11 月前 |
![]() |
Shuxin · 为什么创建Java动态代理需要接口参数 1 年前 |
![]() |
kwarter · 如何模拟RestTemplate代理调用? 1 年前 |
![]() |
Lesha Pipiev · 通过自定义代理向S3发送PUT对象请求 1 年前 |