"Parameter count mismatch" calling Resolve<T>()
I was seeing this exception being thrown in some code recently:
System.Reflection.TargetParameterCountException: Parameter count mismatch.
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at Castle.Core.ReflectionBasedDictionaryAdapter..ctor(Object target)
at Castle.MicroKernel.DefaultKernel.Resolve[T](Object argumentsAsAnonymousType)
The original source line was something like this:
IDictionary<string, object> args = new Dictionary<string, object>();
args.Add( "paramName", "value" );
_kernel.Resolve<ISomething>( args );
That all looks fine, and let’s assume the Something class has indeed a constructor with a string parameter named ‘paramName’. So why isn’t it working?
I should have noticed the clue[1] in the stack trace, but was sure I had identical code elsewhere that was working correctly, so it had me stumped. It was only after taking a break from the code, then playing around with a very simple test project that I realised that while there is a method Resolve<T>(IDictionary)
, that’s not the one that was being called here. Why? Because instead of using var
, I’d declared the variable to be an IDictionary<string, object>
– and surprisingly that interface does not imply you implement IDictionary
(the non-generic version).
When I went back and checked other instances of the code that were working, sure enough I was using var and because Dictionary<> does implement both IDictionary<> and IDictionary it was working as expected.
[1] The clue was the type and parameter name for Resolve - “Object argumentsAsAnonymousType” is obviously not the same as IDictionary!