2016-10-19 15 views
0

我有以下結構:代理服務器的界面,只攔截接口調用+抽象類

abstract class AbstractClass{...} 
interface Interface {...} 
class MyClass : AbstractClass, Interface{...} 

我希望創建一個將採取MyClass的作爲目標的代理,可以轉換爲兩個 - 抽象類和接口但是,它應該只攔截接口調用。

實現該目標的最佳方法是什麼?

+0

待辦事項抽象類和接口有多個方法? – pscuderi

+0

不,但它們不提供接口方法。 –

回答

0

它花了一些小把戲,但是要感謝this SO question,我只能截取接口方法。

考慮:

public abstract class AbstractClass ... 
public interface IBar ... 
public class MyClass : AbstractClass, IBar ... 

這個攔截器應該做你想要什麼:

public class BarInterceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     var map = invocation.TargetType.GetInterfaceMap(typeof(IBar)); 
     var index = Array.IndexOf(map.TargetMethods, invocation.Method); 

     if (index == -1) 
     { 
      // not an interface method 
      invocation.Proceed(); 
      return; 
     } 

     Console.WriteLine("Intercepting {0}", invocation.Method.Name); 
     invocation.Proceed(); 
    } 
} 

我的測試代碼爲:

var mc = new MyClass(); 
var gen = new ProxyGenerator(); 
var proxy = gen.CreateClassProxyWithTarget(typeof(MyClass), mc, new BarInterceptor()); 

((AbstractClass) proxy).GetString(); 
((AbstractClass) proxy).GetInt(); 
((IBar) proxy).GetItem(); 
+0

或更好,然後重寫'ShouldInterceptMethod' http://kozmic.net/2009/01/17/castle-dynamic-proxy-tutorial-part-iii-selecting-which-methods-to/ –