public static void AddConstraint(this Solver solver, Type type, string options) { try { switch (Activator.CreateInstance(type, solver, options)) { case Constraint constraint: solver.AddConstraint(constraint); break; case IConstraintGroup constraintGroup: constraintGroup.AddConstraints(solver); break; } List <string> constraintStrings; if (solver.customInfo.TryGetValue("ConstraintStrings", out object constraintStringsObj)) { constraintStrings = (List <string>)constraintStringsObj; } else { solver.customInfo["ConstraintStrings"] = constraintStrings = new(); } if (string.IsNullOrWhiteSpace(options)) { constraintStrings.Add(type.Name); } else { constraintStrings.Add($"{type.Name}:{options}"); } } catch (Exception e) { throw new ArgumentException($"**ERROR** Cannot instantiate constraint {type.Name}: {e.Message}"); } }