表单流的动态返回类型

时间:2018-06-14 10:49:33

标签: c# botframework formflow

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

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

    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的东西,但如果它可以解决我的问题,我有点怀疑。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

有关详细信息,请参阅此处:https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-formflow-json-schema?view=azure-bot-service-3.0