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()));
		}
		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 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]);
		}