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

Kaf*_*Kaf 8 c# asp.net gridview file-upload .net-3.5

当它找到一个非空文件抛出时,此代码不起作用

无法将类型为"System.String"的对象强制转换为"System.Web.HttpPostedFile".

foreach (System.Web.HttpPostedFile f in Request.Files)
{
   if (f.ContentLength > 0 && f.FileName.EndsWith(".pdf"))
   {
      //work done here
   }
}
Run Code Online (Sandbox Code Playgroud)

另外我测试了Request.Files数组中的每个项目,可以在调试模式下手动输入,如下所示(每个索引)

?(System.Web.HttpPostedFile)Request.Files[index]
{System.Web.HttpPostedFile}
    ContentLength: 536073
    ContentType: "application/pdf"
    FileName: "E:\\2.pdf"
    InputStream: {System.Web.HttpInputStream}
Run Code Online (Sandbox Code Playgroud)

但是,以下代码有效

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
   }
}
Run Code Online (Sandbox Code Playgroud)

什么出了什么问题?谢谢

Mar*_*ell 13

Request.Files是一个HttpFileCollection,反过来是一个NameObjectCollectionBase.这不是显而易见的,但是GetEnumerator()for for产生了收集的关键 - 而不是项目本身.所以:

foreach(string key in Request.Files) {
    // fetch by key:
    var file = Request.Files[key];

    // ....
}
Run Code Online (Sandbox Code Playgroud)

不明显,特别是因为收集是非通用的IEnumerable而不是IEnumerable<string>.

至少记载:

此枚举器将集合的键作为字符串返回.

但是:假设迭代过程会给你文件对象,这并不是不合理的.Files