2009-07-16 52 views
5

在java中它是可以动态地实现使用动态代理是这样的接口,:什么是Java的动态代理的.Net等价物?

public static <T> T createProxy(InvocationHandler invocationHandler, Class<T> anInterface) { 
    if (!anInterface.isInterface()) { 
     throw new IllegalArgumentException("Supplied interface must be an interface!"); 
    } 
    return (T) Proxy.newProxyInstance(anInterface.getClassLoader(), new Class[]{anInterface}, invocationHandler); 
} 

是否有净等效?

回答

4

有迹象表明,在.NET实现这个几个库。 Here's a list of them,带有基准。

+0

是的。有一套提供此功能的框架。 – 2009-07-16 20:51:46

0

有一些解决办法没有直接等价的,但看到How to do Dynamic Proxies in C#

背景:动态代理 在符合特定 接口 运行时动态生成一个类,代理所有调用到 一种“通用”方法。

此前,Stellsmi询问是否可以在.NET中执行此操作(它是Java的标准部分 )。看到它的 我已经在许多天谈论它 第二次,我认为这是值得 博客...

2

是的。你从摘要RealProxy class派生。

+0

你错了。 RealProxies用于完全不同的目的(.NET Remoting)。而且,你不能将它们用于非MBR类型。 – 2009-07-16 20:50:34

+3

RealProxies用于远程处理,但它们不必仅用于此目的。您可以很好地使用它们在同一个进程中拦截呼叫。此外,虽然它们仅限于_classes_的MarshalByRefObject,但问题与_interfaces_有关,并且RealProxy支持所有接口(因为它们始终是vtable分派的)。 – 2009-07-16 21:31:05

1

看看PoshSharp(AOP框架的.NET) - 它可以做类似的事情,但在编译时。可能你更喜欢它支持的方法。

4

最广泛使用的是Castle Project's Dynamic Proxy,它也被几个(或至少1个)模拟框架使用。请记住,在dotnet中默认情况下方法(和属性等提高方法)并不是虚拟的,所以如果你没有在你的类设计中预期它,会产生一些麻烦。

相关问题