从 SharePoint 类引用后备属性时,NULL 计算失败

本文关键字:NULL 计算 失败 属性 SharePoint 引用 | 更新日期: 2023-09-27 18:08:35

我使用以下代码从 SharePoint 检索信息。在测试中,我故意将我的代码发送到 catch 块,这应该使此方法返回 null:

private static ListItemCollection LoadListItemCollection()
{
    try
    {
        using (var ctx = new ClientContext("http://sharepoint"))
        {
            var list = ctx.Web.Lists.GetByTitle("Resource Orders");
            var query = new CamlQuery
            {
                ViewXml =
                    @"<Where><Or><Eq><FieldRef Name=""Status""></FieldRef><Value Type=""Text"">Approved</Value></Eq><IsNotNull><FieldRef Name=""Status"" /></FieldRef></IsNotNull></Or></Where>"
            };
            var collListItem = list.GetItems(query);
            ctx.Load(
                collListItem,
                items =>
                    items.Include(
                        item => item.Id,
                        item => item.DisplayName,
                        item => item.HasUniqueRoleAssignments,
                        item => item["Persona"],
                        item => item["Quantity_x0020_Ordered"],
                        item => item["Resource_x0020_Name"],
                        item => item["Title"],
                        item => item["Customer_x0020_E_x002d_mail"],
                        item => item["Customer_x0020_Phone_x0020_Numbe"],
                        item => item["Customer_x0020_Street"],
                        item => item["Customer_x0020_Suburb"],
                        item => item["Customer_x0020_Postcode"],
                        item => item["Organization"]));
            ctx.ExecuteQuery();
            return collListItem;
        }
    }
    catch (System.Net.WebException)
    {
        MessageBox.Show("Order processor was unable to reach the SharePoint server to download orders.",
                        "SharePoint Currently Unavailable", MessageBoxButton.OK);
        return null;
    }
}

当我在堆栈中进一步实现这一点时,我引用了以下属性(与上述方法位于同一类中(:

public static ListItemCollection LatestOrders => ordersCache = LoadListItemCollection();

这是这样用的:

var collListItem = Orders.LatestOrders;

我最初测试的是使用以下方法检索订单:

if (!collListItem.Any())
{
    MessageBox.Show(
        "No resource orders are currently within the queue.",
        "Order Center",
        MessageBoxButton.OK,
        MessageBoxImage.Information);
    return;
}

但是由于某种原因,即使使用上述方法返回null,它也未能通过此测试并进入代码的下一部分。

为了克服这个问题,我尝试执行以下操作:

if (!collListItem.Any() || collListItem.Equals(null))
{
    MessageBox.Show(
        "No resource orders are currently within the queue.",
        "Order Center",
        MessageBoxButton.OK,
        MessageBoxImage.Information);
    return;
}

但这在本节语句中失败了,但有例外:

发生了类型为"System.ArgumentNullException"的未处理异常 在系统核心中.dll

尝试使用我的对象时,我误解了什么?

从 SharePoint 类引用后备属性时,NULL 计算失败

而不是

if (!collListItem.Any() || collListItem.Equals(null))
   ...

if (collListItems == null || collListItem.Count == 0) // array? - Length
   ...

问题是null检查应该首先发生什么,否则在尝试调用不存在的实例的任何成员时会NullReferenceException(如果您不检查那里的null,扩展方法也是如此(。

我不知道如何找到Any的来源来查看里面有什么,但它可能不允许null(抛出是预期的行为(和另一件事它可能有一些开销,而直接Count检查是清晰有效的。如果您发现它更清晰,您可以保留Any()而不是Count == 0,但null检查是强制性的。