Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Microsoft Bot框架中的对话框之间传递对象?_C#_Bots_Botframework - Fatal编程技术网

C# 如何在Microsoft Bot框架中的对话框之间传递对象?

C# 如何在Microsoft Bot框架中的对话框之间传递对象?,c#,bots,botframework,C#,Bots,Botframework,我试图在Bot框架中的两个对话框之间传递类型为IList的对象。下面是我的代码现在的样子: 主对话框: [Serializable] public class CarouselCardsDialog : IDialog<object> { public async Task StartAsync(IDialogContext context) { context.Wait(this.MessageReceivedAsync); } p

我试图在Bot框架中的两个对话框之间传递类型为
IList
的对象。下面是我的代码现在的样子:

主对话框:

[Serializable]
public class CarouselCardsDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(this.MessageReceivedAsync);
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        //This object, 'attachments' is what I need to pass to the child dialog.
        IList<Attachment> attachments = GetCardsAttachments();
        context.Call(new CarouselDialog(attachments), ResumeAfterPrompt);
    }

    private async Task ResumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
    {
        string input = await result;
        await context.PostAsync(input);
        context.Wait(MessageReceivedAsync);
    }

    private static IList<Attachment> GetCardsAttachments()
    {
        //Get a list of attachment
    }
}
[可序列化]
公共类旋转木马CardSDialog:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
context.Wait(this.MessageReceivedAsync);
}
公共虚拟异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
//我需要将此对象“附件”传递给子对话框。
IList attachments=GetCardsAttachments();
调用(新的CarouselDialog(附件),ResumeAfterPrompt);
}
专用异步任务ResumeAfterPrompt(IDialogContext上下文,IAwaitable结果)
{
字符串输入=等待结果;
等待上下文。PostAsync(输入);
Wait(MessageReceivedAsync);
}
私有静态IList GetCardsAttachments()
{
//获取附件列表
}
}
这是子对话框。我想将附件列表从CarouseCardsDialog传递到此对象:

[Serializable]
public class CarouselDialog : IDialog<string>
{
    private IList<Attachment> _attachments;

    public CarouselDialog(IList<Attachment> attachments)
    {
        _attachments = attachments;
    }

    public async Task StartAsync(IDialogContext context)
    {
        IMessageActivity reply = context.MakeMessage();
        reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
        reply.Attachments = _attachments;
        await context.PostAsync(reply);
        context.Wait(MessageReceivedAsync);
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        IMessageActivity activity = await result;
        context.Done(activity.Text);
    }
}
[可序列化]
公共类旋转木马:IDialog
{
私人IList_附件;
公共旋转木马(IList附件)
{
_附件=附件;
}
公共异步任务StartAsync(IDialogContext上下文)
{
IMessageActivity reply=context.MakeMessage();
reply.AttachmentLayout=attachmentlayoututypes.Carousel;
答复.附件=_附件;
等待上下文。PostAsync(回复);
Wait(MessageReceivedAsync);
}
公共虚拟异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
IMessageActivity活动=等待结果;
context.Done(activity.Text);
}
}
但是,当我运行此代码时,会出现以下错误:

例外:在程序集中键入“Microsoft.Bot.Connector.Attachment” 'Microsoft.Bot.Connector,版本=3.5.1.0,区域性=中性, PublicKeyToken=31bf3856ad364e35'未标记为可序列化


我做错了什么?有办法解决这个问题吗?

不确定是否存在异常,但解决方法是为制作附件所需的所有数据创建一个模型,然后将此数据保存在上下文的UserData属性中

context.UserData.SetValue<MyModel>("AttachmentsModel", instanceOfModel);
context.UserData.SetValue(“AttachmentsModel”,instanceOfModel);
然后在第二个对话框中检索此模型

MyModel model;
context.UserData.TryGetValue<MyModel>("AttachmentsModel", out model);
MyModel模型;
context.UserData.TryGetValue(“AttachmentsModel”,out model);

我认为您也可以尝试将IAttachment对象放置在此属性中,但模型会更好,因为它实际上不是用来容纳大型对象的。

错误消息使您的“Attachment”类听起来像是需要[Serializable],否则依赖它的类也不会是这样。@CSmith感谢您的输入。问题是附件类属于框架,所以我认为改变它是不现实的。您知道这样的问题是否有解决方法吗?您可以创建自己的类,将其标记为可序列化,并使用附件类中感兴趣的值填充它。。