-
Notifications
You must be signed in to change notification settings - Fork 485
ArgumentException: "Could not find method overriding method" with overridden class method having generic by-ref parameter #655
Copy link
Copy link
Closed
Description
Note that I encountered this using NSubstitute and I'm not using Castle.Core directly, but the stack trace comes from Castle.Core and tells me it is likely a bug and asks me to report it. (NSubstitute issue: nsubstitute/NSubstitute#716 )
Version used is 5.0.0, running on .NET Framework 4.8
System.ArgumentException : Could not find method overriding Boolean TryCreateControl[TResult](IBaseControl, IHasGridLinesDefined, TResult ByRef) on type MyControlFactory. This is most likely a bug. Please report it.
at Castle.DynamicProxy.Internal.InvocationHelper.ObtainMethod(MethodInfo proxiedMethod, Type type)
at Castle.Core.Internal.SynchronizedDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Castle.DynamicProxy.Internal.InvocationHelper.GetMethodOnType(Type type, MethodInfo proxiedMethod)
at NSubstitute.Proxies.CastleDynamicProxy.CastleInvocationMapper.Map(IInvocation castleInvocation)
at NSubstitute.Proxies.CastleDynamicProxy.CastleForwardingInterceptor.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.MyControlFactoryProxy.TryCreateControl[TResult](IBaseControl control, IHasGridLinesDefined parentGrid, TResult& result)
This occurs when trying to configure an interception for a (generic) method (with an out argument) that is overridden but not defined on the class being proxied.
public interface IControlFactory
{
bool TryCreateControl<TResult>(IBaseControl control, IHasGridLinesDefined? parentGrid, [MaybeNullWhen(false)] out TResult result);
}
public class ControlFactory: IControlFactory
{
public virtual bool TryCreateControl<TResult>(IBaseControl control, IHasGridLinesDefined? parentGrid, [MaybeNullWhen(false)] out TResult result) { /* ... */ }
}
public class MyControlFactory: ControlFactory
{
// If this override is removed, code runs as expected
public override bool TryCreateControl<TResult>(IBaseControl control, IHasGridLinesDefined? parentGrid, [MaybeNullWhen(false)] out TResult result) { /* ... */ }
}
[Test]
void MyTest()
{
// sorry, this is nsubstitute syntax. I don't know how this translates to Castle.Core calls, but I hope it provides enough information on what I am trying to do
var control = Substitute.For<IStringTextBoxControl>();
var controlFactory = Substitute.For<MyControlFactory>();
controlFactory.Configure().TryCreateControl<object>(default, default, out var _)
.ReturnsForAnyArgs(ci => { ci[2] = control; return true; }); // <== exception here
}Reactions are currently unavailable