【问题标题】:Add an extra interface using Castle Dynamic Proxy 2?使用 Castle Dynamic Proxy 2 添加额外的接口?
【发布时间】:2011-09-05 00:24:15
【问题描述】:

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

【问题讨论】:

    标签: c# castle-dynamicproxy


    【解决方案1】:

    您可以使用具有additionalInterfacesToProxy 参数的ProxyGenerator.CreateClassProxy() 的重载。例如,如果您有一个具有字符串名称属性的类,并且想要添加一个 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 属性在此处不必是虚拟的,如果您不想代理它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-11-08
        • 2012-06-01
        • 2011-10-24
        • 2011-10-03
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 2019-02-10
        相关资源
        最近更新 更多