public static float GetScienceValue(Dictionary <string, int> experimentCount, ScienceExperiment experiment, ScienceSubject currentScienceSubject, Func <ScienceExperiment, ScienceSubject, float> GetScienceValue = null, Func <ScienceExperiment, ScienceSubject, float> GetNextScienceValue = null) { //Call via generic method to account for "new" modifiers in custom implementations of ScienceExperiment var args = new object[] { experimentCount, experiment, currentScienceSubject, GetScienceValue, GetNextScienceValue }; var m = _getScienceValueGenericMethod ?? (_getScienceValueGenericMethod = typeof(Science).GetMethods(BindingFlags.Static | BindingFlags.Public) .First(e => e.IsGenericMethod && e.Name == nameof(GetScienceValue) && e.GetParameters().Length == args.Length)); return((float)m.MakeGenericMethod(experiment?.GetType() ?? typeof(ScienceExperiment)).Invoke(null, args)); }