Перехват метода от абстрактного родителя на производном экземпляре с использованием DynamicProxy - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть объект, полученный из абстрактного базового класса, и я хочу перехватить метод объекта.

Поддерживает ли DynamicProxy этот сценарий?Кажется, я могу создавать прокси только по интерфейсу или без цели, но не по абстрактному базовому классу с целью

public abstract class Sandwich
{
    public abstract void ShareWithFriend();
}

public sealed class PastramiSandwich : Sandwich
{
    public override void ShareWithFriend()
    {
        throw new NotSupportedException("No way, dude");
    }
}

class SandwichInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        try
        {
            invocation.Proceed();
        }
        catch (NotSupportedException)
        {
            // too bad
        }
    }
}

internal class Program
{
    private static void Main()
    {
        var sandwich = new PastramiSandwich();
        var generator = new ProxyGenerator();

        // throws ArgumentException("specified type is not an interface")
        var proxy1 = generator.CreateInterfaceProxyWithTarget<Sandwich>(
            sandwich,
            new SandwichInterceptor());
        proxy1.ShareWithFriend();

        // does not accept a target
        var proxy2 = generator.CreateClassProxy<Sandwich>(
            /* sandwich?, */
            new SandwichInterceptor());
        // hence the method call fails in the interceptor
        proxy2.ShareWithFriend();
    }
}

1 Ответ

0 голосов
/ 01 сентября 2011

Это работает:

var proxy1 = generator.CreateClassProxyWithTarget<Sandwich>(
    sandwich,
    new SandwichInterceptor());
proxy1.ShareWithFriend();
...