UWP中使用C#开发时如何从FolderInformation获取StorageFolder?
问题原因
C# 与 C++/WinRT 的类型转换逻辑存在本质差异:
- C++/WinRT 的
try_as<T>是底层 COM 接口查询逻辑,只要对象实现了目标类型对应的 COM 接口即可转换成功,不限制托管层的类继承关系 - C# 的
as关键字做类类型转换时,要求实例的实际类型必须是目标类或其派生类。你通过GetVirtualizedFoldersVector拿到的对象实际类型是Windows.Storage.BulkAccess.FolderInformation,它和StorageFolder是两个平级的 WinRT 运行时类,仅共同实现了IStorageFolder接口,不存在继承关系,因此直接类转换必然返回 null。
解决方法
不需要调用路径相关的获取接口,直接通过内置扩展方法转换即可,完全兼容 KnownFolders.MediaServerDevices 这类无路径的虚拟化位置:
using Windows.Storage; using Windows.Storage.BulkAccess; private void FolderListView_ItemClick(object sender, ItemClickEventArgs args) { var clickedItem = args.ClickedItem; if (clickedItem != null) { if (clickedItem is FolderInformation folderInfo) { // 调用IStorageItem扩展方法直接转换为StorageFolder实例 StorageFolder folder = folderInfo.AsStorageFolder(); // 后续可正常使用folder对象 } } }
如果你不需要强类型的 StorageFolder 实例,只是要调用文件夹的常规操作方法,也可以直接转换为 IStorageFolder 接口使用,效果一致。
内容的提问来源于stack exchange,提问作者Anup
相关产品推荐
相关产品推荐

