Your help was very appreciated. I'll report it as a potential enhancement and will work around it for now.
Cheers, Kam On Sep 25, 11:13 pm, Krzysztof Koźmic <[email protected]> wrote: > Kam, > > You ask for a proxy with target interface. That's the crucial part here. > This kind of proxy takes no assumption about what the type of the target > object is. > > You then ask it to create a proxy, where IInterfaceB is the main target, > and ICommon is additional interfaces. That means that the target is > required to implement InterfaceB, and it might or might not implement > InterfaceA or ICommon. > Hence when you ask NOT to proxy TestB, since InterfaceB is the primary > interface for proxy the call will be forwarded to the target object. > In Castle of Common2, target does not need to implement it, so when you > ask NOT to proxy the method, DP does not proxy it, nor does it try to > forward the call to target, since it takes no assumptions about the target. > > To get the behavior you want use interface proxy with target. > > However I agree that the behavior you were expecting makes some sense in > case of proxy with target interface as well, so if you want, go ahead > and log it in the issue tracker as future enhancement. > > cheers, > Krzysztof > > On 25/09/2010 11:49 PM, Kam wrote: > > > 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 > > ... > > read more >> -- 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.
