public override void Apply <T>(ref IMessageActivity message, string prompt, IReadOnlyList <T> options, IReadOnlyList <string> descriptions = null, string speak = null) { SetField.CheckNull(nameof(prompt), prompt); SetField.CheckNull(nameof(options), options); message.Speak = speak; message.InputHint = InputHints.ExpectingInput; if (descriptions == null) { descriptions = (from option in options select option.ToString()).ToList(); } switch (PromptStyle) { case PromptStyle.Auto: case PromptStyle.Keyboard: if (options != null && options.Any()) { if (PromptStyle == PromptStyle.Keyboard) { message.SuggestedActions = new SuggestedActions(actions: GenerateButtons(options, descriptions)); message.Text = prompt; } else { var heroCard = new HeroCard(text: prompt, buttons: GenerateButtons(options, descriptions)); message.AttachmentLayout = AttachmentLayoutTypes.Carousel; message.Attachments = new List <Attachment>() { (isAdaptiveCard) ? heroCard.ToAdaptiveCard().ToAttachment() : heroCard.ToAttachment() }; } } else { message.Text = prompt; } break; case PromptStyle.AutoText: Apply(ref message, prompt, options, options?.Count() > 4 ? PromptStyle.PerLine : PromptStyle.Inline, descriptions); break; case PromptStyle.Inline: //TODO: Refactor buildlist function to a more generic namespace when changing prompt to use recognizers. message.Text = $"{prompt} {Microsoft.Bot.Builder.FormFlow.Advanced.Language.BuildList(descriptions, Resources.DefaultChoiceSeparator, Resources.DefaultChoiceLastSeparator)}"; break; case PromptStyle.PerLine: message.Text = $"{prompt}{Environment.NewLine}{Microsoft.Bot.Builder.FormFlow.Advanced.Language.BuildList(descriptions.Select(description => $"* {description}"), Environment.NewLine, Environment.NewLine)}"; break; case PromptStyle.None: default: message.Text = prompt; break; } }