Let's say, for example, that we have a LoginDialog (reusable dialog) that is called at different times to access specific areas/dialogs of your bot.
Being a reusable dialog, you don't want to write explicit call of child dialog.
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); }} Maybe you have more than one dialogs that need login validation.
What you want to do is to use reflection in order to reuse that dialog?
I tried something like this:
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); } } I get an error on this line:
context.Call(Activator.CreateInstance(type), ResumeAfter); Type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly.
What do you recommend? A forced cast (as IDialog<object>)?