首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BotBuilder CustomRecognizer不工作

BotBuilder CustomRecognizer不工作
EN

Stack Overflow用户
提问于 2018-02-24 11:42:35
回答 1查看 93关注 0票数 0

我正在尝试实现自定义识别器,但无法使它工作。CustomRecognizer.Parse不被调用。

代码样本:

代码语言:javascript
复制
var form = new MyForm();
            var formDialog = new FormDialog<MyForm>(form, MyForm.BuildForm, FormOptions.PromptInStart);
            context.Call(formDialog, OnFormFinished);

    [Serializable]
    public class MyForm
    {
        [Describe("Custom field")]
        [Prompt("Please enter custom field")]
        public string Field { get; set; }

        public static IForm<MyForm> BuildForm()
        {
            return new FormBuilder<MyForm>()
                        .Field(new CustomField<MyForm>(nameof(Field)))
                        .Build();
        }
    }

    public class CustomField<T> : FieldReflector<T> where T : class
    {
        public CustomField(string name, bool ignoreAnnotations = false)
            : base(name, ignoreAnnotations) { }

        public override IForm<T> Form
        {
            set
            {
                base.Form = value;
                SetRecognizer(new CustomRecognizer<T>(this));
            }
        }
    }

    public class CustomRecognizer<T> : RecognizePrimitive<T> where T : class
    {
        public CustomRecognizer(IField<T> field)
            : base(field)
        {
        }

        public override DescribeAttribute ValueDescription(object value)
        {
            return new DescribeAttribute((string)value);
        }

        public override IEnumerable<string> ValidInputs(object value)
        {
            yield return (string)value;
        }

        public override TermMatch Parse(string input)
        {
            TermMatch result = new TermMatch(0, input.Length, 1.0, input);
            return result;
        }

        public override string Help(T state, object defaultValue)
        {
            var prompt = new Prompter<T>(_field.Template(TemplateUsage.StringHelp), _field.Form, null);
            var args = HelpArgs(state, defaultValue);
            return prompt.Prompt(state, _field, args.ToArray()).Prompt;
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-26 19:40:51

来自文档 for SetRecognizer:

只有在使用DefineAsyncDelegate动态定义字段时才应该调用这一点,因为识别器通常需要该字段,并且在本地化更改时经常会更改。

因此,如果您将.BuildForm更改为:

代码语言:javascript
复制
public static IForm<MyForm> BuildForm()
{
        return new FormBuilder<MyForm>()

                    .Field(new CustomField<MyForm>(nameof(TestField))
                            .SetDefine(async (state, field) =>
                            {
                                field.SetRecognizer(new CustomRecognizer<MyForm>(field));                                   
                                return true;
                            }))
                    .Build();
}

更多细节可以在这里找到:https://github.com/Microsoft/BotBuilder/issues/213

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48962456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档