C# 此列表在我的代码中的哪一点<&燃气轮机;变空了? 命名空间消息 { 公共部分类电子邮件 { 列表附件=新列表(); 受保护的无效页面加载(对象发送方、事件参数e) { foreach(文档列表中的文档) { 附件.增加(文件); } } 受保护的无效BTN发送\单击(对象发送方,事件参数e) { 发送邮件(附件); } } }
您可以猜到,为了便于解释,我已经把这段代码删去了,但这就是我所做的一切。我有一种感觉,这与深度/浅层复制和克隆有关,如果是的话-有人能帮助解释一下这里发生了什么,以及我如何避免它/以不同的方式填充列表吗 非常感谢 丹 编辑:对不起,我在写“文档列表”的地方实际上是这样写的:C# 此列表在我的代码中的哪一点<&燃气轮机;变空了? 命名空间消息 { 公共部分类电子邮件 { 列表附件=新列表(); 受保护的无效页面加载(对象发送方、事件参数e) { foreach(文档列表中的文档) { 附件.增加(文件); } } 受保护的无效BTN发送\单击(对象发送方,事件参数e) { 发送邮件(附件); } } },c#,list,clone,shallow-copy,C#,List,Clone,Shallow Copy,您可以猜到,为了便于解释,我已经把这段代码删去了,但这就是我所做的一切。我有一种感觉,这与深度/浅层复制和克隆有关,如果是的话-有人能帮助解释一下这里发生了什么,以及我如何避免它/以不同的方式填充列表吗 非常感谢 丹 编辑:对不起,我在写“文档列表”的地方实际上是这样写的: namespace Messages { public partial class Email { List<Document> attachments = new List<
namespace Messages
{
public partial class Email
{
List<Document> attachments = new List<Document>();
protected void Page_Load(object sender, EventArgs e)
{
foreach(Document document in documentList)
{
attachments.Add(document);
}
}
protected void btnSend_Click(object sender, EventArgs e)
{
sendMail(attachments);
}
}
}
(列表)会话[请求.查询字符串[“文档列表”]]
所以,它来自一个会话变量。使用断点,我可以看到附件列表填充得很好,但是当涉及到click事件处理程序时,它是空的!?不是null,只是count==0。它变为空,因为它没有存储在ViewState中(我在这里根据方法名称假设asp.net webforms) 看到和 或者,将该值存储在会话中,请参见 EDIT2:有了额外的信息-我以前遇到过一些问题,这些问题已经通过将代码移出Page_load并移入助手方法(更好)来解决,并在事件回调中使用它。我最初确实声明事件回调在页面加载之前出现-但是我刚刚检查了这一点,它没有,但是我确信我过去遇到过一个问题,在某些情况下,对于子控件,页面加载没有完成-可能与验证有关 无论如何,它可能应该沿着以下行重新编码-以消除页面加载和附件之间的依赖性。使用IENumerables(而不是列表)也可以很简洁-参见最后一个示例 e、 g
但是,也值得建议使用LINQ这样做:
protected void btnSend_Click(object sender, EventArgs e)
{
sendMail(getAttachments());
}
IEnumerable getAttachments()
{
返回((列表)会话[Request.QueryString[“documentList”]])。选择(doc=>doc);
}
受保护的无效BTN发送\单击(对象发送方,事件参数e)
{
sendMail(getAttachments());
//或者,如果sendMail不接受IEnumerable,请执行以下操作:
//sendMail(getAttachments().ToList());
}
谢谢你。注意:附件显然是调试时为空的列表。能否在add()调用中添加断点以确保“documentList”不为空?调试时,请尝试折叠附件列表,您可以看到值在某一点上发生了变化。您能解释一下documentList是如何填充的以及何时处于页面生命周期吗?您可能对代码进行了太多的剥离;-)我看不出有什么不对劲的地方(除了不知从哪里冒出来的文档列表)。所以问题一定出在我们看不到的地方。
List<Document> getAttachments()
{
List<Document> attachments = new List<Document>();
foreach(Document document in (List<Document>)Session[Request.QueryString["documentList"]])
attachments.Add(document);
}
protected void btnSend_Click(object sender, EventArgs e)
{
sendMail(getAttachments());
}
IEnumerable<Document> getAttachments()
{
return ((List<Document>)Session[Request.QueryString["documentList"]]).Select(doc => doc);
}
protected void btnSend_Click(object sender, EventArgs e)
{
sendMail(getAttachments());
// or if sendMail doesn't accept IEnumerable then do :
//sendMail(getAttachments().ToList());
}