foreach 循环无法转换,但手动转换和 for 循环工作
本文关键字:转换 循环 for 工作 foreach | 更新日期: 2023-09-27 17:58:16
当它找到一个无空文件抛出时,此 代码不起作用
无法将类型为"System.String"的对象强制转换为类型 'System.Web.HttpPostedFile'.
foreach (System.Web.HttpPostedFile f in Request.Files)
{
if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
{
//work done here
}
}
我还测试了数组中的每个项目Request.Files
可以在调试模式下手动转换,如下所示(每个索引(
?(System.Web.HttpPostedFile)Request.Files[index]
{System.Web.HttpPostedFile}
ContentLength: 536073
ContentType: "application/pdf"
FileName: "E:''2.pdf"
InputStream: {System.Web.HttpInputStream}
但是,以下代码有效
for (index = 0; index < Request.Files.Count; index++)
{
System.Web.HttpPostedFile f = Request.Files[index];
if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
{
//work done here
}
}
知道出了什么问题吗?谢谢
Request.Files
是一个HttpFileCollection
,而又是一个NameObjectCollectionBase
。这并不明显,但GetEnumerator()
会产生集合的密钥 - 而不是项目本身。所以:
foreach(string key in Request.Files) {
// fetch by key:
var file = Request.Files[key];
// ....
}
不明显,特别是因为集合是非通用的IEnumerable
而不是IEnumerable<string>
。
它至少被记录在案:
此枚举器以字符串形式返回集合的键。
但是:假设遍历Files
会给你文件对象并不是没有道理的。
像下面这样尝试..它会工作
foreach (string fName in Request.Files)
{
System.Web.HttpPostedFile f = Request.Files[fName];
if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
{
//work done here
}
}
HttpFileCollection 返回文件的键,而不是 HttpPostedFile 对象,所以只有它抛出错误。