public override object Invoke(object[] args) { Debug.Assert(args.Length == 9); if (args.Any(x => x == null || Convert.IsDBNull(x))) { return(0.0); } var frameTime = TimeSpan.FromSeconds((long)args[0]); // unbox then cast to int var frames = (int)((long)args[1]); var baseCredit = (double)args[2]; var kFactor = (double)args[3]; var preferredDays = (double)args[4]; var maximumDays = (double)args[5]; DateTime downloadDateTime; DateTime.TryParseExact((string)args[6], "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out downloadDateTime); DateTime completionDateTime; DateTime.TryParseExact((string)args[7], "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out completionDateTime); var calcOption = (long)args[8]; TimeSpan unitTime = TimeSpan.Zero; switch (BonusCalculation) { case BonusCalculationType.FrameTime: unitTime = TimeSpan.FromSeconds(frameTime.TotalSeconds * frames); break; case BonusCalculationType.DownloadTime: unitTime = completionDateTime.Subtract(downloadDateTime); break; } if (calcOption != 0) { return(ProductionCalculator.GetBonusCredit(baseCredit, kFactor, preferredDays, maximumDays, unitTime)); } return(ProductionCalculator.GetBonusPPD(frameTime, frames, baseCredit, kFactor, preferredDays, maximumDays, unitTime)); }