【问题标题】:How to save Files and Folder in a general List?如何将文件和文件夹保存在一般列表中?
【发布时间】:2021-09-20 11:29:20
【问题描述】:

我已经初始化了一个通用列表,我想从 Sharepoint 中保存所有文件和文件夹。

List<object> filesAndFolders = new List<object>();

我已从 SharePoint 加载所有文件和文件夹并将它们添加到列表中,现在我想访问 FieldValues,但是当我尝试遍历列表时,我无法访问文件或文件夹,因为它被保存为对象{Microsoft.Sharepoint.Client.File} 或文件夹。

foreach(var item in filesAndFolders){
      //getFiledValues here
      item.ListItemAllFields.FiledValues .. 
}

我有一个错误说 item.ListItemAllFields.FiledValues 不存在。我该如何解决这个问题并能够将文件和文件夹保存在一个列表中? 谢谢!

【问题讨论】:

  • object 没有属性 ListItemAllFields 所以编译器会抱怨。在您的通用列表中,您也可以存储不具有该属性的其他类型的对象,因此编译器可以保护您免受错误的影响。要访问该属性,您需要将条目转换为正确的类型,例如var fileItem = item as Microsoft.Sharepoint.Client.File; 然后使用文件项。如果 item 不是该类型,则 fileItem 将为 null,并且您将在运行时收到错误。

标签: c# asp.net-core sharepoint


【解决方案1】:

您可以像这样在运行时检查对象的类型:

            List<object> filesAndFolders = new List<object>();
            foreach (var item in filesAndFolders)
            {
                if (item is Microsoft.Sharepoint.Client.File)
                {
                    var fileItem = item as Microsoft.Sharepoint.Client.File;
                    // do stuff with fileItem
                }
                else if (item is Microsoft.Sharepoint.Client.Folder)
                {
                    var folderItem = item as Microsoft.Sharepoint.Client.Folder;
                    // do stuff with folderItem
                }
                else
                {
                    // Oops, some other object type
                }
            }

尽管由于公司防火墙,我无法访问@Fildor 的小提琴,但我相信他或她建议使用以下更紧凑的形式之一:

        foreach (var item in filesAndFolders)
            {
                if (item is Microsoft.Sharepoint.Client.File fileItem)
                {
                    // do stuff with fileItem
                }
                else if (item is Microsoft.Sharepoint.Client.Folder folderItem)
                {
                    // do stuff with folderItem
                }
                else
                {
                    // Oops, some other object type
                }
            }

或者这个

foreach (var item in filesAndFolders)
            {
                switch (item)
                {
                    case File fileItem:
                        // do stuff with fileItem
                        break;
                    case Folder folderItem:
                        // do stuff with folderItem
                        break;
                    default:
                        // Oops, some other object type
                        break;
                }
            }

这在 c# 版本 7.0 中成为可能。

【讨论】:

  • 你可以同时做一个和一个开关:dotnetfiddle.net/rUmoEr
  • @Fildor,你说得对,我自己就是这样做的,但有时将步骤分开并使用更简单的结构会使 OP 更清楚。为什么不发布您的建议作为答案?
【解决方案2】:

使用 ClientObject 作为列表中的类型。

using Microsoft.SharePoint.Client.ClientObject;

List<ClientObject> filesAndFolders = new List<ClientObject>();

foreach(var item in filesAndFolders){
    //getFiledValues here
}

【讨论】:

  • OP 正在使用来自 Microsoft.Sharepoint.Client 命名空间的类。您可以制作复合材料,但不能让它们基于自定义类。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多