.Net中与Java的动态代理相当的是什么?

8
在Java中,可以使用动态代理来动态实现接口,类似于以下代码:
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);
}

在 .Net 中有相应的等价物吗?
5个回答

5

是的,有一组框架提供这个功能。 - Alex Yakunin

5
最广泛使用的一个是Castle Project的动态代理,也被一些(或至少1个)模拟框架所使用。请注意,在dotnet中,默认情况下,方法(以及像属性这样的糖衣语法方法)不是虚拟的,因此如果您没有在类设计中预料到它,可能会遇到一些麻烦。

不止一个模拟框架。在这里查看http://castleproject.org/dynamicproxy/index.html,了解使用动态代理的项目的非常部分列表。 - Krzysztof Kozmic

3

你错了。RealProxies被用于完全不同的目的(.NET Remoting)。此外,你不能将它们用于非MBR类型。 - Alex Yakunin
4
RealProxies通常用于远程调用,但并非仅限于此。你也完全可以使用它们来拦截同一进程中的调用。此外,虽然它们只能用于MarshalByRefObject类,但问题是涉及接口,而RealProxy支持所有接口(因为它们总是使用vtable-dispatch进行分派)。 - Pavel Minaev

1

同时也可以看看PoshSharp(.NET的AOP框架)- 它可以在编译时完成类似的事情。也许你会更喜欢它所支持的方法。


0

虽然没有直接的等价物,但是可以参考如何在C#中实现动态代理来进行一些解决方案:

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

之前,Stellsmi问是否可能在.NET中实现这一点(它是Java的标准部分)。既然我在过去的两天里已经谈论了两次,我认为值得写博客...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接