public IRuleExecutor CreateDedicatedExecutor(IRulePresenter rule) { switch (rule.RuleType) { case RulePresenterType.Root: return(CreateGeneratorRuleExecutor((GeneratorRulePresenter)rule)); case RulePresenterType.Entity: return(CreateEntityRuleExecutor((EntityRulePresenter)rule)); case RulePresenterType.Attribute: return(CreateAttributeRuleExecutor((AttributeRulePresenter)rule)); case RulePresenterType.Operation: return(CreateOperationRuleExecutor((OperationRulePresenter)rule)); default: break; } throw new ArgumentException($"{rule.GetType().Name} rule not supported"); }