Skip to content

Commit

Permalink
draft
Browse files Browse the repository at this point in the history
  • Loading branch information
stakx committed Jul 22, 2022
1 parent e758285 commit 781de05
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 13 deletions.
Expand Up @@ -131,15 +131,15 @@ public void Default_implementation_called_when_method_not_proxied_in_class_proxy
}

[Test]
public void Default_implementation_called_when_method_not_proxied_in_class_proxy_with_target()
public void Target_implementation_called_when_method_not_proxied_in_class_proxy_with_target()
{
var options = new ProxyGenerationOptions { Hook = new ProxyNothingHook() };
var target = new InheritsDefaultInterfaceMethod();
var target = new ImplementsDefaultInterfaceMethod();
var proxy = (IHaveDefaultInterfaceMethod)generator.CreateClassProxyWithTarget(target, options);

var returnValue = proxy.Method();

Assert.AreEqual("default implementation", returnValue);
Assert.AreEqual("implementation", returnValue);
}

[Test]
Expand All @@ -154,27 +154,27 @@ public void Default_implementation_called_when_method_not_proxied_in_interface_p
}

[Test]
public void Default_implementation_called_when_method_not_proxied_in_interface_proxy_with_target()
public void Target_implementation_called_when_method_not_proxied_in_interface_proxy_with_target()
{
var options = new ProxyGenerationOptions { Hook = new ProxyNothingHook() };
var target = new InheritsDefaultInterfaceMethod();
var target = new ImplementsDefaultInterfaceMethod();
var proxy = generator.CreateInterfaceProxyWithTarget<IHaveDefaultInterfaceMethod>(target, options);

var returnValue = proxy.Method();

Assert.AreEqual("default implementation", returnValue);
Assert.AreEqual("implementation", returnValue);
}

[Test]
public void Default_implementation_called_when_method_not_proxied_in_interface_proxy_with_target_interface()
public void Target_implementation_called_when_method_not_proxied_in_interface_proxy_with_target_interface()
{
var options = new ProxyGenerationOptions { Hook = new ProxyNothingHook() };
var target = new InheritsDefaultInterfaceMethod();
var target = new ImplementsDefaultInterfaceMethod();
var proxy = generator.CreateInterfaceProxyWithTargetInterface<IHaveDefaultInterfaceMethod>(target, options);

var returnValue = proxy.Method();

Assert.AreEqual("default implementation", returnValue);
Assert.AreEqual("implementation", returnValue);
}

public interface IHaveDefaultInterfaceMethod
Expand All @@ -188,6 +188,14 @@ string Method()
public class InheritsDefaultInterfaceMethod : IHaveDefaultInterfaceMethod
{
}

public class ImplementsDefaultInterfaceMethod : InheritsDefaultInterfaceMethod
{
public string Method()
{
return "target implementation";
}
}
}
}

Expand Down
Expand Up @@ -44,7 +44,7 @@ protected override IEnumerable<MembersCollector> GetCollectors()

foreach (var @interface in targetType.GetAllInterfaces())
{
yield return new InterfaceMembersWithDefaultImplementationCollector(@interface, targetType);
yield return new InterfaceMembersWithDefaultImplementationCollector(@interface, targetType, forProxyWithTarget: false);
}

foreach (var @interface in interfaces)
Expand Down
Expand Up @@ -43,7 +43,7 @@ protected override IEnumerable<MembersCollector> GetCollectors()

foreach (var @interface in targetType.GetAllInterfaces())
{
yield return new InterfaceMembersWithDefaultImplementationCollector(@interface, targetType);
yield return new InterfaceMembersWithDefaultImplementationCollector(@interface, targetType, forProxyWithTarget: true);
}

foreach (var @interface in interfaces)
Expand Down
Expand Up @@ -23,8 +23,9 @@ namespace Castle.DynamicProxy.Contributors
internal sealed class InterfaceMembersWithDefaultImplementationCollector : MembersCollector
{
private readonly InterfaceMapping map;
private readonly bool forProxyWithTarget;

public InterfaceMembersWithDefaultImplementationCollector(Type @interface, Type classToProxy)
public InterfaceMembersWithDefaultImplementationCollector(Type @interface, Type classToProxy, bool forProxyWithTarget)
: base(@interface)
{
Debug.Assert(@interface != null);
Expand All @@ -36,6 +37,7 @@ public InterfaceMembersWithDefaultImplementationCollector(Type @interface, Type
Debug.Assert(@interface.IsAssignableFrom(classToProxy));

map = classToProxy.GetInterfaceMap(@interface);
this.forProxyWithTarget = forProxyWithTarget;
}

protected override MetaMethod GetMethodToGenerate(MethodInfo method, IProxyGenerationHook hook, bool standalone)
Expand All @@ -53,7 +55,7 @@ protected override MetaMethod GetMethodToGenerate(MethodInfo method, IProxyGener
Debug.Assert(hasTarget);

var proxyable = AcceptMethod(method, onlyVirtuals: true, hook);
if (!proxyable)
if (!proxyable && !forProxyWithTarget)
{
return null;
}
Expand Down

0 comments on commit 781de05

Please sign in to comment.