public RuleTemplateInfo GetTemplate(RuleDescriptor descriptor)
        {
            Guard.NotNull(descriptor, nameof(descriptor));

            var info = new RuleTemplateInfo
            {
                TemplateName = GetValueTemplateName(descriptor)
            };

            return(info);
        }
        protected virtual string GetValueTemplateName(RuleDescriptor descriptor)
        {
            if (descriptor.Metadata.TryGetValue("ValueTemplateName", out var val) &&
                val is string name &&
                name.HasValue())
            {
                return(name);
            }

            string templateName;
            var    type = descriptor.RuleType;

            if (descriptor.SelectList != null || type == RuleType.IntArray || type == RuleType.FloatArray || type == RuleType.StringArray)
            {
                templateName = "Dropdown";
            }
            else if (type == RuleType.Boolean || type == RuleType.NullableBoolean)
            {
                templateName = "Boolean";
            }
            else if (type == RuleType.Int || type == RuleType.NullableInt)
            {
                templateName = "Int32";
            }
            else if (type == RuleType.Float || type == RuleType.NullableFloat)
            {
                templateName = "Float";
            }
            else if (type == RuleType.Money)
            {
                templateName = "Decimal";
            }
            else if (type == RuleType.DateTime || type == RuleType.NullableDateTime)
            {
                templateName = "DateTime";
            }
            else
            {
                // Fallback to simple text-box.
                templateName = "TextBox";
            }

            return("ValueTemplates/" + templateName);
        }