2016-10-19 34 views
0

I以下の構造:プロキシはインターフェイスを呼び出すインターセプト+抽象クラスをインタフェースする

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

が、私は両方にキャストすることができ、ターゲットとしてのMyClassを取るとプロキシを作成したい - AbstractClassとのインタフェースをただし、インターフェイスコールのみを傍受する必要があります。

これを達成する最も良い方法は何ですか?

+0

ドゥAbstractClassとのインタフェースは、重複した方法がありますか? – 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/ –

関連する問題