public void Cleanup() { try { foreach (var given in Givens.Select(x => new { Method = x.Key, Text = x.Value })) { if (!Context.CleanUps.ContainsKey(given.Text)) { continue; } var result = Context.TestRunContext[TestType.Name + given.Text]; //if it doesn't take arguments just execute it if (!Context.CleanUps[given.Text].Method.GetParameters().Any()) { Context.CleanUps[given.Text].DynamicInvoke(); continue; } //if it takes one argument pass in the result if (Context.CleanUps[given.Text].Method.GetParameters().Count() == 1) { Context.CleanUps[given.Text].DynamicInvoke(result); continue; } //if it takes multiple arguments parse the tuple and pass them in var count = result.GetType().GetGenericArguments().Count(); if (count > 0) { var type = result.GetType(); var argList = new List <object>(); for (int i = 1; i <= count; i++) { argList.Add(type.GetProperty("Item" + i).GetValue(result, null)); } Context.CleanUps[given.Text].DynamicInvoke(argList.ToArray()); continue; } Console.WriteLine("Found cleanup for {0} but didn't know how to call it", given.Text); } foreach (var teardownMethod in _teardownMethods) { teardownMethod.Invoke(); } } catch { } }