5

我想为现有类型创建一个动态代理,但添加一个尚未在目标类型上声明的新接口的实现。我不知道如何实现这一目标。有任何想法吗?

4

2 回答 2

6

您可以使用ProxyGenerator.CreateClassProxy()具有additionalInterfacesToProxy参数的重载。例如,如果您有一个具有字符串名称属性的类,并且想要添加一个IEnumerable<char>枚举名称字符的类,您可以这样做:

public class Foo
{
    public virtual string Name { get; protected set; }

    public Foo()
    {
        Name = "Foo";
    }
}

class FooInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        if (invocation.Method == typeof(IEnumerable<char>).GetMethod("GetEnumerator")
            || invocation.Method == typeof(IEnumerable).GetMethod("GetEnumerator"))
            invocation.ReturnValue = ((Foo)invocation.Proxy).Name.GetEnumerator();
        else
            invocation.Proceed();
    }
}

…

var proxy = new ProxyGenerator().CreateClassProxy(
    typeof(Foo), new[] { typeof(IEnumerable<char>) }, new FooInterceptor());

Console.WriteLine(((Foo)proxy).Name);
foreach (var c in ((IEnumerable<char>)proxy))
    Console.WriteLine(c);

请注意Name,如果您不想代理它,这里的属性不必是虚拟的。

于 2011-05-30T21:14:26.173 回答
2

使用重载创建接受additionalInterfacesToProxy参数的代理

于 2011-05-30T21:07:49.627 回答