Sorry about that. Here's the amalgamated code listing.

Kam
----------------

using System;
using System.Reflection;
using Castle.DynamicProxy;

namespace GenericMethodProxyTest
{
  class Program
  {
    static void Main(string[] args)
    {
      var tb = new TestB();

      Type[] interfaces = tb.GetType().GetInterfaces();

      var proxyGenerator = new ProxyGenerator();
      var genOptions = new ProxyGenerationOptions { Hook = new
NonProxiedGenerationHook() };

      var proxy =
(IInterfaceB)proxyGenerator.CreateInterfaceProxyWithTargetInterface(typeof(IInterfaceB),
interfaces,
 
tb, genOptions, new ActiveObjectInterceptor());

      ((IInterfaceA)proxy).TestA1();
      ((IInterfaceA)proxy).TestA2();
      ((IInterfaceB)proxy).TestB1();
      ((IInterfaceB)proxy).TestB2();

      ((ICommon)proxy).Common1();

      // Stepping in will not go anywhere. The target method is never
reached since there's no console output.
      ((ICommon)proxy).Common2();
    }
  }

  public class NonProxiedAttribute : Attribute
  {
  }

  public interface ICommon
  {
    void Common1();

    [NonProxied]  // This one doesn't work, it doesn't seem to do
anything for the call.
    void Common2();
  }

  public interface IInterfaceA
  {
    void TestA1();

    void TestA2();
  }

  public interface IInterfaceB
  {
    void TestB1();

    [NonProxied]  // This one works, the call to TestB2 is not
intercepted but reaches target.
    void TestB2();
  }

  public abstract class TestA : IInterfaceA, ICommon
  {
    void ICommon.Common1()
    {
      Console.WriteLine(" - Reached target Common1()\n");
    }

    void ICommon.Common2()
    {
      Console.WriteLine(" - Reached target Common2()\n");
    }

    void IInterfaceA.TestA1()
    {
      Console.WriteLine(" - Reached target TestA1()\n");
    }

    void IInterfaceA.TestA2()
    {
      Console.WriteLine(" - Reached target TestA2()\n");
    }
  }

  public class TestB : TestA, IInterfaceB
  {
    void IInterfaceB.TestB1()
    {
      Console.WriteLine(" - Reached target TestB1()\n");
    }

    void IInterfaceB.TestB2()
    {
      Console.WriteLine(" - Reached target TestB2()\n");
    }
  }

  public class ActiveObjectInterceptor : StandardInterceptor
  {
    protected override void PerformProceed(IInvocation invocation)
    {
      Console.WriteLine(String.Format("Intercepted call to {0}\n",
invocation.Method.Name));
      base.PerformProceed(invocation);
    }
  }

  public abstract class ProxyGenerationHookBase : IProxyGenerationHook
  {
    public abstract bool ShouldInterceptMethod(Type type, MethodInfo
methodInfo);
    public virtual void NonProxyableMemberNotification(Type type,
MemberInfo memberInfo)
    {
    }
    public virtual void MethodsInspected()
    {
    }
    protected bool IsPropertyAccessor(MethodInfo method)
    {
      return (IsPropertySetter(method) | IsPropertyGetter(method));
    }
    protected bool IsPropertySetter(MethodInfo method)
    {
      var methodName = method.Name;
      return (method.IsSpecialName && methodName.StartsWith("set_",
StringComparison.Ordinal));
    }
    protected bool IsPropertyGetter(MethodInfo method)
    {
      var methodName = method.Name;
      return (method.IsSpecialName && methodName.StartsWith("get_",
StringComparison.Ordinal));
    }
  }

  public class NonProxiedGenerationHook : ProxyGenerationHookBase
  {
    public override bool ShouldInterceptMethod(Type type, MethodInfo
methodInfo)
    {
      bool intercept = true;

      if (methodInfo.IsDefined(typeof(NonProxiedAttribute), true))
      {
        intercept = false;
      }

      return intercept;
    }

    #region Equality

    public override bool Equals(object obj)
    {
      return ((obj != null) && (obj.GetType() ==
typeof(NonProxiedGenerationHook)));
    }

    public override int GetHashCode()
    {
      return GetType().GetHashCode();
    }

    public static bool operator ==(NonProxiedGenerationHook left,
NonProxiedGenerationHook right)
    {
      return Equals(left, right);
    }

    public static bool operator !=(NonProxiedGenerationHook left,
NonProxiedGenerationHook right)
    {
      return !Equals(left, right);
    }

    #endregion
  }
}



On Sep 25, 3:00 am, Krzysztof Koźmic <[email protected]>
wrote:
>   Can you provide full code that compiles and runs?
>
> cheers,
> Krzysztof
>
> On 24/09/2010 11:53 AM, Kam wrote:
>
> > Hi Krzysztof, thanks for lending a hand. Here's a quick snippet of the
> > failing test along with console output.
>
> > *************
> >    class Program
> >    {
> >      static void Main(string[] args)
> >      {
> >        var tb = new TestB();
>
> >        Type[] interfaces = tb.GetType().GetInterfaces();
>
> >        var factory = new ProxyFactory();
>
> >        var proxy =
> > factory.CreateInterfaceProxyWithTarget<IInterfaceB>(tb, new[]
> > { InterceptorType.Validator },
>
> > ProxyGenerationHookType.Selective, interfaces);
>
> >        ((IInterfaceA)proxy).TestA1();
> >        ((IInterfaceA)proxy).TestA2();
> >        ((IInterfaceB)proxy).TestB1();
> >        ((IInterfaceB)proxy).TestB2();
>
> >        ((ICommon)proxy).Common1();
>
> >        // Stepping in will not go anywhere. The target method is never
> > reached since there's no console output.
> >        ((ICommon)proxy).Common2();
> >      }
> >    }
>
> >    public interface ICommon
> >    {
> >      void Common1();
>
> >      [NonProxied]  // This one doesn't work, it doesn't seem to do
> > anything for the call.
> >      void Common2();
> >    }
>
> >    public interface IInterfaceA
> >    {
> >      void TestA1();
>
> >      void TestA2();
> >    }
>
> >    public interface IInterfaceB
> >    {
> >      void TestB1();
>
> >      [NonProxied]  // This one works, the call to TestB2 is not
> > intercepted but reaches target.
> >      void TestB2();
> >    }
>
> >    public abstract class TestA : IInterfaceA, ICommon
> >    {
> >      void ICommon.Common1()
> >      {
> >        Console.WriteLine(" - Reached target Common1()\n");
> >      }
>
> >      void ICommon.Common2()
> >      {
> >        Console.WriteLine(" - Reached target Common2()\n");
> >      }
>
> >      void IInterfaceA.TestA1()
> >      {
> >        Console.WriteLine(" - Reached target TestA1()\n");
> >      }
>
> >      void IInterfaceA.TestA2()
> >      {
> >        Console.WriteLine(" - Reached target TestA2()\n");
> >      }
> >    }
>
> >    public class TestB : TestA, IInterfaceB
> >    {
> >      void IInterfaceB.TestB1()
> >      {
> >        Console.WriteLine(" - Reached target TestB1()\n");
> >      }
>
> >      void IInterfaceB.TestB2()
> >      {
> >        Console.WriteLine(" - Reached target TestB2()\n");
> >      }
> >    }
>
> >    public class ActiveObjectInterceptor : StandardInterceptor
> >    {
> >      protected override void PerformProceed(IInvocation invocation)
> >      {
> >        Console.WriteLine(String.Format("Intercepted call to {0}\n",
> > invocation.Method.Name));
> >        base.PerformProceed(invocation);
> >      }
> >    }
>
> >    public class NonProxiedGenerationHook : ProxyGenerationHookBase
> >    {
> >      public override bool ShouldInterceptMethod(Type type, MethodInfo
> > methodInfo)
> >      {
> >        bool intercept = true;
>
> >        if (methodInfo.IsDefined(typeof(NonProxiedAttribute), true))
> >        {
> >          intercept = false;
> >        }
>
> >        return intercept;
> >      }
>
> >      #region Equality
> >      ...
> >      #endregion
> >    }
> > ***************
>
> > Output:
>
> > Intercepted call to TestA1
>
> >   - Reached target TestA1()
>
> > Intercepted call to TestA2
>
> >   - Reached target TestA2()
>
> > Intercepted call to TestB1
>
> >   - Reached target TestB1()
>
> >   - Reached target TestB2()
>
> > Intercepted call to Common1
>
> >   - Reached target Common1()
>
> > *********************
>
> > As you can see, I expected to see the line "- Reached target
> > Common2()" without the line "Intercepted call to Common2()" much like
> > the non-proxied call to TestB2(). I made sure the supplied list of
> > additional interfaces to proxy does include ICommon.
>
> > Thanks
>
> > On Sep 23, 8:19 pm, Krzysztof Koźmic<[email protected]>
> > wrote:
> >> can you provide a failing test?
>
> >> I'm not sure I understand the scenario 2 here
>
> >> 2010/9/24 Kam<[email protected]>
>
> >>> Hi,
> >>> I'm currently using IProxyGenerationHook to control which methods to
> >>> exclude for proxy generation for a given interface. My current
> >>> hierarchy of classes and interfaces is the following:
> >>> Class_A implements interfaces Interface_A and Interface_Z
> >>> Class_B inherits Class_A and also implements interfaces Interface_B
> >>> Interface_B inherits Interface_Z.
> >>> I created a proxy to interface Interface_B with a target instance of
> >>> Class_B, and gave it Interface_Z as additional interface to include in
> >>> the proxy generation process.
> >>> I use custom attributes on methods/properties to mark for exclusion.
> >>> i.e. [NonProxied].
> >>> Scenario 1:
> >>> If I mark a method belonging to Interface_B, the hook will exclude it
> >>> and any calls through the proxy to that marked method will reach the
> >>> target object's method without interception. (Behaviour I expected).
> >>> Scenario 2:
> >>> If I mark a method belonging to Interface_Z and cast my proxy instance
> >>> to (Interface_Z) to make a call to the marked method, the call will
> >>> not reach its target object. From a debugger point of view, attempting
> >>> to step-in won't do anything. The execution proceeds to the next line
> >>> without interception nor forwarding to the real implementation. I get
> >>> this behaviour even without attaching the debugger. (Expected the call
> >>> to reach the target instance's method implementation without
> >>> interceptors).
> >>> To summarize, using proxy generation hook to exclude seems to work
> >>> only for first level interface methods and properties but not for
> >>> inherited interfaces with marked methods or properties.
> >>> Perhaps this is not supported or I'm just missing something? Has
> >>> anyone else experienced a similar scenario?
> >>> Thanks in advance!
> >>> --
> >>> You received this message because you are subscribed to the Google Groups
> >>> "Castle Project Users" group.
> >>> To post to this group, send email to [email protected]
> >>> .
> >>> To unsubscribe from this group, send email to
> >>> [email protected]<castle-project-users%[email protected]>
> >>> .
> >>> For more options, visit this group at
> >>>http://groups.google.com/group/castle-project-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en.

Reply via email to