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
   }
}

知道出了什么问题吗?谢谢

foreach 循环无法转换,但手动转换和 for 循环工作

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 对象,所以只有它抛出错误。