2016-10-19 13 views
0

я иметь следующую структуру:прокси-интерфейс + абстрактный класс, который перехватывает только интерфейс называет

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

Я хочу, чтобы создать прокси-сервер, который будет принимать MyClass в качестве мишени, может быть отлиты как к - AbstractClass и интерфейс , однако он должен только перехватывать вызовы интерфейса.

Каков наилучший способ достичь этого?

+0

Do 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/ –