2017-03-08 67 views
-1

我不是那么伟大的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

您忘记了正确标记问题。什么是IDialogContext?至于queston,'Wait()'方法可能有重载接受与'MessageReceivedAsync'方法类型相同的委托(参见[this](http://stackoverflow.com/q/2082615/1997232)问题),那么所有的需要的是提供*该方法的名称*(如果这是你的困惑),在'Wait'方法内部,某些参数会调用委托,所以最后**是**'MessageReceivedAsync(context,argument)'调用。 – Sinatr

+0

您是否在派生类中基类对该方法有匹配的重载? – lokusking

+0

@lokusking没有派生类 – Happy

回答

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)); 
+0

任何好的学习和实践?会非常感谢 – Happy

+0

不是真的,这是基本的c#东西。当你到达代表时,任何教科书都会覆盖它。 –