我在c#中表现不佳。但我试图理解这个关于BOT框架的代码。这是方法
namespace HotelBot.Dialogs
{
[Serializable]
public class GreetingDialog : IDialog
{
public async Task StartAsync(IDialogContext context)
{
await context.PostAsync("I am kiran");
context.Wait(MessageRecievedAsync);
}
public virtual async Task MessageRecievedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var message = await argument;
var userName = string.Empty;
context.UserData.TryGetValue<string>("Name", out userName);
if (string.IsNullOrEmpty(userName))
{
await context.PostAsync("What is your name");
userName = message.Text;
context.UserData.SetValue<string>("Name", userName);
}
else
{
await context.PostAsync(string.Format("Hi {0}. How can i help u?" + userName));
}
context.Wait(MessageRecievedAsync);
}
}
}
代码中的这一行调用该方法
context.Wait(MessageRecievedAsync); // why no parameters are required
我想知道为什么该函数不需要传递参数?
答案 0 :(得分:3)
它不需要参数的原因是Wait
的方法签名看起来像
void Wait<R>(ResumeAfter<R> resume)
ResumeAfter<R>
定义为
delegate Task ResumeAfter<in T> (IDialogContext context, IAwaitable<T> result)
所以这是一个代表。对于代理人,您可以在不包含指定类型的地方进行简写。你称之为真实的东西是
context.Wait(new ResumeAfter<IMessageActivity>(MessageRecievedAsync));
创建的内容传递对MessageRecievedAsync
的引用,并让Wait
调用其中的函数。如果你熟悉lambda表达式,你可以用另一种方式写出:
context.Wait((IDialogContext context, IAwaitable<IMessageActivity> result) => MessageRecievedAsync(context, result));