/// <summary>
        /// Get a list of rules from the type
        /// </summary>
        /// <param name="type">The <see cref="Type"/> to get rules from </param>
        /// <param name="ruleValidatorType">The domaintype to get businessrule from. Available types: <see cref="RuleValidatorType"/></param>
        /// <returns>A list of <see cref="BusinessRuleInfo"/></returns>
        private IList <BusinessRuleInfo> GetBusinessRules(Type type, RuleValidatorType ruleValidatorType)
        {
            var res = new List <BusinessRuleInfo>();

            if (type == null)
            {
                return(res);
            }

            var props = type.GetMethods();

            foreach (var item in props)
            {
                var ny = new BusinessRuleInfo()
                {
                    BusinessRule = item.Name,
                    Deprecated   = false,
                    RuleType     = ruleValidatorType,
                };
                if (ny != null && item.ReturnType == typeof(Outcome))
                {
                    var attribute = item.GetCustomAttribute <RuleAttribute>();
                    if (attribute != null)
                    {
                        ny.Comment    = attribute.Description;
                        ny.Deprecated = attribute.Deprecated;
                    }
                    res.Add(ny);
                }
            }
            return(res);
        }
        /// <summary>
        /// Validate an xelement against its domain rules AND general rules
        /// </summary>
        /// <param name="ruleType">Domaintype</param>
        /// <param name="ruleNames">List of rule names to validate against</param>
        /// <param name="element">The element to validate</param>
        /// <returns>A list of BusinessRuleReturnInfo containing the xelement and outcome from rule</returns>
        public IList <BusinessRuleValidateResult> ValidateRules(RuleValidatorType ruleValidatorType, IList <string> ruleNames, XElement element)
        {
            var  result     = new List <BusinessRuleValidateResult>();
            Type domainType = RuleHelper.GetRuleDomainType(ruleValidatorType);

            //Test domainrules
            RuleValidationForType(domainType, ruleNames, result, element);
            //Test General rules
            RuleValidationForType(typeof(GeneralBusinessRules), ruleNames, result, element);
            return(result);
        }
        /// <summary>
        /// Get a list of rules from the domain, general rules can also be included
        /// </summary>
        /// <param name="ruleValidatorType">The domaintype to get businessrule from. Available types: <see cref="RuleValidatorType"/></param>
        /// <param name="includeGeneralBusinessRules">Include general business rules</param>
        /// <returns>A list of <see cref="BusinessRuleInfo"/></returns>
        public IList <BusinessRuleInfo> GetBusinessRules(RuleValidatorType ruleValidatorType, bool includeGeneralBusinessRules = true)
        {
            var res        = new List <BusinessRuleInfo>();
            var domainType = GetRuleDomainType(ruleValidatorType);

            res.AddRange(GetBusinessRules(domainType, ruleValidatorType));
            if (includeGeneralBusinessRules)
            {
                var generalType = GetRuleDomainType(RuleValidatorType.GENERAL);
                res.AddRange((GetBusinessRules(generalType, RuleValidatorType.GENERAL)));
            }
            return(res);
        }
        /// <summary>
        /// Resolves domainclass from type
        /// </summary>
        /// <param name="typeToUse">The domaintype. Available types: <see cref="RuleValidatorType"/></param>
        /// <returns>A <see cref="Type"/> for the actual domaintype</returns>
        internal static Type GetRuleDomainType(RuleValidatorType typeToUse)
        {
            switch (typeToUse)
            {
            case RuleValidatorType.PEST:
                return(typeof(PestBusinessRules));

            case RuleValidatorType.CHEM:
                return(typeof(ChemBusinessRules));

            case RuleValidatorType.VMPR:
                return(typeof(VmprBusinessRules));

            case RuleValidatorType.GENERAL:
                return(typeof(GeneralBusinessRules));
            }
            return(null);
        }