C# 捕获环境的匿名方法闭包不可序列化

C# 捕获环境的匿名方法闭包不可序列化,c#,botframework,C#,Botframework,我得到以下错误: 异常:捕获环境的匿名方法闭包是不可序列化的,考虑删除环境捕获或使用反射序列化代理:助理。 当我试图在链中设置内部属性时 你能帮忙吗 我的代码: public enum SystemSelection { SharePoint, BizTalk, Azure, Office365 }; public enum RequestType { Bug, SupportRequest, Question }; public enum Importance { Blocking, High

我得到以下错误:

异常:捕获环境的匿名方法闭包是不可序列化的,考虑删除环境捕获或使用反射序列化代理:助理。 当我试图在链中设置内部属性时

你能帮忙吗

我的代码:

public enum SystemSelection { SharePoint, BizTalk, Azure, Office365 };
public enum RequestType { Bug, SupportRequest, Question };
public enum Importance { Blocking, High, Medium, Low };

[Serializable]
class Declaration
{
    public string Type;
    public string Amount;
    public string Date;

    public static IForm<Declaration> BuildForm()
    {
        return new FormBuilder<Declaration>()
                .Message("Add a declaration")
                .Build();
    }
}

[Serializable]
class SupportRequest
{

    public SystemSelection? SystemSelection;
    public RequestType? RequestType;
    public Importance? Importance;

    public Declaration Declaration;

    public static IForm<SupportRequest> BuildForm()
    {
        return new FormBuilder<SupportRequest>()
                .Message("Welcome to the simple support bot!")
                .AddRemainingFields()
                .Build();
    }

    internal static IDialog<SupportRequest> MakeRootDialog3()
    {
        SupportRequest t = null;
        var dlg = Chain.ContinueWith(FormDialog.FromForm(SupportRequest.BuildForm),
                            async (context, res) =>
                            {
                                t = await res;
                                return Chain.ContinueWith<Declaration, SupportRequest>(FormDialog.FromForm(Declaration.BuildForm),
                                                            async (context2, res2) =>
                                                            {
                                                                t.Declaration = await res2;
                                                                return Chain.Return(t);
                                                            });
                            });

        return dlg;
    }
}
公共枚举系统选择{SharePoint、BizTalk、Azure、Office365};
公共枚举请求类型{Bug,SupportRequest,Question};
公共枚举重要性{阻塞、高、中、低};
[可序列化]
类声明
{
公共字符串类型;
公共字符串数量;
公共字符串日期;
公共静态表单BuildForm()
{
返回新的FormBuilder()
.Message(“添加声明”)
.Build();
}
}
[可序列化]
类支持请求
{
公共系统选择?系统选择;
公共请求类型?请求类型;
公共重要性;
公开声明;
公共静态表单BuildForm()
{
返回新的FormBuilder()
.Message(“欢迎使用简单支持机器人!”)
.AddRemainingFields()
.Build();
}
内部静态IDialog MakeRootDialog3()
{
SupportRequest t=null;
var dlg=Chain.ContinueWith(FormDialog.FromForm(SupportRequest.BuildForm)),
异步(上下文,res)=>
{
t=等待res;
return Chain.ContinueWith(FormDialog.FromForm(Declaration.BuildForm)),
异步(context2,res2)=>
{
t、 声明=等待res2;
返回链。返回(t);
});
});
返回dlg;
}
}

这是意料之中的,因为匿名方法不可序列化,并且根据,您需要确保所有对话框都可序列化:

确保所有对话框都可序列化。 这可以像在IDialog实现中使用[Serializable]属性一样简单。但是,请注意,如果匿名方法闭包引用其外部环境来捕获变量,则它们是不可序列化的。Bot框架支持基于反射的序列化代理,以帮助序列化未标记为可序列化的类型

您必须将定义为匿名方法的
ResumeAfter
延续替换为非匿名方法

或者,您可以尝试通过将反射序列化代理添加到Autofac容器来注册它。在global.asax中,尝试添加以下代码:

Conversation.UpdateContainer(builder =>
{   
    builder.RegisterModule(new ReflectionSurrogateModule());
});