如何将SharePoint的文件和文件夹存入通用List并访问FieldValues属性
解决方案
报错的核心原因有两个:
- 你使用
List<object>存储元素时,编译器默认将遍历的item识别为object类型,而object本身没有定义ListItemAllFields属性,无法直接访问 - 代码存在拼写错误:
FiledValues应为FieldValues,拼写错误也会触发属性不存在的报错
你可以根据自己的项目场景选择以下任意一种方案解决:
方案1:遍历中做类型判断与转换(最稳妥,无额外改造)
使用C#模式匹配语法,在遍历时判断元素真实类型后转换,无需修改原有列表定义:
foreach(var item in filesAndFolders) { if (item is File file) { var fieldValues = file.ListItemAllFields.FieldValues; // 处理文件字段值逻辑 } else if (item is Folder folder) { var fieldValues = folder.ListItemAllFields.FieldValues; // 处理文件夹字段值逻辑 } }
方案2:使用dynamic类型简化代码(语法简洁但类型不安全)
如果能100%确定列表中仅会存入File和Folder两类对象,可以用dynamic绕过编译期类型检查,运行时自动解析属性:
// 方案A:修改列表初始化定义 List<dynamic> filesAndFolders = new List<dynamic>(); // 方案B:遍历时将item转为dynamic foreach(dynamic item in filesAndFolders) { var fieldValues = item.ListItemAllFields.FieldValues; // 直接处理字段值即可 }
注意:如果列表中混入其他类型对象,运行时会抛出属性找不到的异常。
方案3:封装统一实体类(可维护性最高,适合复杂项目)
如果后续需要处理更多文件/文件夹的公共属性,可以自定义包装类统一封装逻辑,避免重复的类型判断:
// 自定义统一存储实体 public class SharePointItem { public Dictionary<string, object> FieldValues { get; set; } // 可扩展其他公共属性:名称、路径、创建时间等 } // 存入列表时统一转换为包装类 List<SharePointItem> filesAndFolders = new List<SharePointItem>(); // 存入文件示例 filesAndFolders.Add(new SharePointItem { FieldValues = targetFile.ListItemAllFields.FieldValues }); // 存入文件夹示例 filesAndFolders.Add(new SharePointItem { FieldValues = targetFolder.ListItemAllFields.FieldValues }); // 遍历时直接访问属性 foreach(var item in filesAndFolders) { var fieldValues = item.FieldValues; }
额外注意:使用SharePoint CSOM获取
File/Folder对象时,需要显式加载ListItemAllFields属性才能正常访问,否则即使类型正确也会抛出属性未初始化的异常,加载示例:ctx.Load(targetFile, f => f.ListItemAllFields); ctx.Load(targetFolder, f => f.ListItemAllFields); ctx.ExecuteQuery();
内容的提问来源于stack exchange,提问作者Alea
相关产品推荐
相关产品推荐

