2017-03-08 4 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'とは何ですか?クエストオンの場合、 '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) 

として定義されているようなので、それはデリゲートで見えています。デリゲートを使用すると、型の指定を除外した省略形を行うことができます。あなたが呼ばれる本物はMessageRecievedAsyncへの参照を渡し、その中Waitコール機能をすることができます作成​​

context.Wait(new ResumeAfter<IMessageActivity>(MessageRecievedAsync)); 

ました。ラムダ式に慣れているなら別の方法でこれを書くことができます:

+0

実際にそれを学び実践してみましたか?本当にありがたいです – Happy

+0

これは基本的なC#のものです。あなたが代議員になると、どんな教科書でもそれをカバーします。 –

関連する問題