protected override IDictionary GetArguments(MethodInfo method, object[] arguments) { var parameters = method.GetParameters(); var arg = new Arguments(); for (var i = 0; i < parameters.Length; i++) { if (arg.Contains(parameters[i].ParameterType)) { if (IsFunc(method.DeclaringType)) { throw new ArgumentException( string.Format("Factory delegate {0} has duplicated arguments of type {1}. " + "Using generic purpose delegates with duplicated argument types is unsupported, because then it is not possible to match arguments properly. " + "Use some custom delegate with meaningful argument names or interface based factory instead.", method.DeclaringType, parameters[i].ParameterType)); } // else we just ignore it. It will likely be matched by name so we don't want to throw prematurely. We could log this though. } else { arg.Add(parameters[i].ParameterType, arguments[i]); } arg.Add(parameters[i].Name, arguments[i]); } return arg; }
public void Custom_stores_get_picked_over_default_ones() { var arguments = new Arguments(new CustomStringStore()); var key = "foo"; var value = new object(); arguments.Add(key, value); Assert.AreEqual("boo!", arguments[key]); }
/// <summary> /// Selects arguments to be passed to resolution pipeline. /// By default passes all given <paramref name = "arguments" /> /// keyed by names of their corresponding <paramref name = "method" /> parameters. /// </summary> /// <param name = "method"></param> /// <param name = "arguments"></param> /// <returns></returns> protected virtual IDictionary GetArguments(MethodInfo method, object[] arguments) { var argumentMap = new Arguments(); var parameters = method.GetParameters(); for (var i = 0; i < parameters.Length; i++) { argumentMap.Add(parameters[i].Name, arguments[i]); } return argumentMap; }
public void By_default_any_type_as_key_is_supported() { var arguments = new Arguments(new CustomStringComparer()); var key = new object(); var value = "foo"; arguments.Add(key, value); Assert.AreEqual("foo", arguments[key]); }
public void Handles_string_as_key_case_insensitive() { var arguments = new Arguments(); var key = "foo"; var value = new object(); arguments.Add(key, value); Assert.IsTrue(arguments.Contains(key.ToLower())); Assert.IsTrue(arguments.Contains(key.ToUpper())); }
public void Handles_string_as_key() { var arguments = new Arguments(); var key = "Foo"; var value = new object(); arguments.Add(key, value); Assert.AreEqual(1, arguments.Count); Assert.IsTrue(arguments.Contains(key)); Assert.AreSame(value, arguments[key]); }
public void Custom_stores_get_picked_over_default_ones_in_clone() { var arguments = new Arguments(new CustomStringComparer()); var key = "foo"; var value = new object(); arguments.Add(key, value); var clone = (IDictionary)((ICloneable)arguments).Clone(); Assert.AreEqual(value, clone["boo!"]); }