c# - 表单流的动态返回类型

标签 c# botframework formflow

我目前正在寻找一种根据数据库中预定义的值动态创建 FormDialog 的方法。换句话说,我的字段类型、提示和设置都存储在数据库中,而我想要实现的是读取这些设置并动态构建适当的表单。

到目前为止我尝试的是类似于以下内容。假设我有一个表单,其中包含一个姓名(字符串)和一个年龄(int)字段( FieldDefinition 是我创建的一个类,用于存储字段的参数,假设它们是从数据库中获取的)(代码被剥离只是为了说明这个想法):

    public static IForm<dynamic> BuildForm()
    {
        string FormMessage = "Welcome to demo contact form!";
        string CompletionMessage = "Thank your for your info. Our team will contact you as soon as possible.";

        var fields = new List<FieldDefinition>()
        {
            new FieldDefinition()
            {
                Name = "Name",
                FieldType = typeof(string),
                Prompts = new string[] { "What's your name?", "Please input your name" }
            },
            new FieldDefinition()
            {
                Name = "Age",
                FieldType = typeof(int),
                Prompts = new string[] { "What's your age?", "How old are you?" }
            }
        };



        var builder = new FormBuilder<dynamic>();
        builder.Message(FormMessage);

        foreach (var f in fields)
        {
            builder.Field(
                new FieldReflector<dynamic>(f.Name)
                .SetType(f.FieldType)
                );
        }

        builder.AddRemainingFields()
        .OnCompletion(async (context, order) => {
            var message = context.MakeMessage();
            message.Text = CompletionMessage;
            await context.PostAsync(message);
        });
        return builder.Build();
    }

问题来了:

  1. 我想我可以使用dynamic 类型。但是方法不能返回一个 dynamic 对象,因为它是在运行时确定的。因此,当我尝试使用以下方法构建表单时出现错误:

    dynamic values; var form = new FormDialog<dynamic>(values, ContactForm.BuildForm, FormOptions.PromptInStart, null);`
    
  2. 我需要动态创建对象的属性,因此我寻找一种在运行时创建 Type 的方法。我最终得到了一个名为 TypeBuilder 的东西,但我有点怀疑它是否能解决我的问题。

因此,我想最终的开始是使用 FieldReflector 但我不知道如何实现它。我正在寻找与上述类似但确实有效的东西。

最佳答案

你看过 FormBuilderJson 了吗?您可以动态构建 .json 字符串,并在运行时构建表单:

public static IForm<JObject> BuildJsonForm()
{
    string fromFlowJson = GetFormFlowJson();

    return new FormBuilderJson(schema)
         .AddRemainingFields()
         .Build();
}

查看此处了解更多信息:https://learn.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-formflow-json-schema?view=azure-bot-service-3.0

关于c# - 表单流的动态返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50855711/

相关文章:

c# - 检查自定义属性的方法

c# - 在 ASP.NET MVC 中使用属性实现对象级安全性

node.js - 如何在 Microsoft Bot 服务中使用直线发布到网络聊天?

c# - 拦截与获取Windows版本相关的API调用

c# - 如何在 C# 中获取音频/视频和捕获设备的列表?

node.js - Bot 框架 Directline - 使用 node.js 更改 Bot 名称运行时

sharepoint - 使用 Sharepoint 作为 QnA Maker 的源

c# - 更改 botframework Formflow 中的确认选项

artificial-intelligence - BotBuilder - FormFlow - 如何更改确认选项语言