2009-07-16 73 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中默認情況下方法(和屬性等提高方法)並不是虛擬的,所以如果你沒有在你的類設計中預期它,會產生一些麻煩。

相關問題