从 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
尝试使用我的对象时,我误解了什么?
而不是
if (!collListItem.Any() || collListItem.Equals(null))
...
用
if (collListItems == null || collListItem.Count == 0) // array? - Length
...
问题是null
检查应该首先发生什么,否则在尝试调用不存在的实例的任何成员时会NullReferenceException
(如果您不检查那里的null
,扩展方法也是如此(。
我不知道如何找到Any
的来源来查看里面有什么,但它可能不允许null
(抛出是预期的行为(和另一件事它可能有一些开销,而直接Count
检查是清晰有效的。如果您发现它更清晰,您可以保留Any()
而不是Count == 0
,但null
检查是强制性的。