2017-10-31 3 views
1

たとえば、ボットの特定の領域/ダイアログにアクセスするために異なる時刻に呼び出されるLoginDialog(再利用可能なダイアログ)があるとします。ボットフレームワークは再利用可能なダイアログからダイアログを動的に呼び出します

再利用可能なダイアログであるため、子ダイアログの明示的な呼び出しを作成したくありません。

public class LoginDialog : IDialog<object> { 

public async Task StartAsync(IDialogContext context) { 
    var message = "Insert password"; 

    PromptDialog.Text(context, AfterPassword, 
      message, 
      null, 
      1); 
} 

public async Task AfterPassword(IDialogContext context, IAwaitable<string> result) { 
     var password = await result; 
     var valid = await Mocks.ValidatePasswordMockAsync(password); 

     if (valid) { 
    context.Call(new TheDialog(), ResumeAfter); 
     } else context.Call(new TransferDialog(), ResumeAfter); 
    } 

private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) { 
     context.Done<object>(null); 
    }} 

ログイン確認が必要なダイアログが複数あることがあります。

あなたはそのダイアログを再利用するためにリフレクションを使用しますか?私は、この行にエラーが発生します

public class LoginDialog : IDialog<object> { 

    private string classToCall; 

    public LoginDialog(string classToCall) { 
     this.classToCall = classToCall; 
    } 

    public async Task StartAsync(IDialogContext context) { 
     var message = "Insert password"; 

     PromptDialog.Text(context, AfterPassword, message, null, 1); 
    } 

    public async Task AfterPassword(IDialogContext context, IAwaitable<string> result) { 
     var password = await result; 
     var valid = await Mocks.ValidatePasswordMockAsync(password); 

     if (valid) { 
      var type = Type.GetType(classToCall); 
      context.Call(Activator.CreateInstance(type), ResumeAfter); 
     } 
     else 
      context.Call(new TransferDialog(), ResumeAfter); 
    } 

    private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) { 
     context.Done<object>(null); 
    } 
} 

context.Call(Activator.CreateInstance(type), ResumeAfter); 

型の引数は、使用から推測することはできません

私はこのような何かを試してみました。型引数を明示的に指定してみてください。

あなたは何をお勧めしますか?強制キャスト(IDialog<object>)?

答えて

2

LoginDialogに次のダイアログを呼び出す責任を委任する代わりに、LoginDialogを有効にするかどうかを返すようにして、発信者が次に呼び出す相手を決定させるようにしてください。

問題については、まずType.GetTypeが期待したものを返しているかどうかを確認してから、問題が存在するかどうかを確認するためにキャストしてください。

+1

あなたは両方の権利があります。 まず、この問題に関して、私はGetTypeのバブルを作りました。 私はFunc >を使用しています。新しいLoginDialog(()=> new TheDialog()) 次に、あなたは絶対に正しいと思います。私は結果をログインダイアログから戻って、次のダイアログを外に決めます。 –

関連する問題