我正在尝试实现自定义识别器,但无法使它工作。CustomRecognizer.Parse不被调用。
代码样本:
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;
}
}发布于 2018-02-26 19:40:51
来自文档 for SetRecognizer:
只有在使用DefineAsyncDelegate动态定义字段时才应该调用这一点,因为识别器通常需要该字段,并且在本地化更改时经常会更改。
因此,如果您将.BuildForm更改为:
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
https://stackoverflow.com/questions/48962456
复制相似问题